[MySQL] SET TRANSACTION 문
- Databases/MySQL
- 2020. 9. 12.
■ SET TRANSACTION 문
SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic: {
ISOLATION LEVEL level
| access_mode
}
level: {
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
access_mode: {
READ WRITE
| READ ONLY
}
이 명령문은 트랜잭션 특성을 지정합니다. 쉼표로 구분된 하나 이상의 특성값 목록을 가져옵니다. 각 특성값은 트랜잭션 격리 수준 또는 액세스 모드를 설정합니다. 격리 수준은 InnoDB 테이블 작업에 사용됩니다. 액세스 모드는 트랜잭션이 읽기 / 쓰기 또는 읽기 전용 모드로 작동하는지 여부를 지정합니다.
또한 SET TRANSACTION은 명령문의 범위를 표시하기 위해 선택적 GLOBAL 또는 SESSION 키워드를 포함 할 수 있습니다.
+ 트랜잭션 분리 수준
+ 트랜잭션 접근 모드
+ 트랜잭션 특성 범위
■ 트랜잭션 격리 수준
트랜잭션 분리 레벨을 설정하려면 ISOLATION LEVEL 레벨 절을 사용하십시오. 동일한 SET TRANSACTION 문에 여러 ISOLATION LEVEL 절을 지정할 수 없습니다.
기본 격리 레벨은 REPEATABLE READ입니다. 허용되는 다른 값은 READ COMMITTED, READ UNCOMMITTED 및 SERIALIZABLE입니다.
격리레벨(Isolation Level) 참고 링크
myinfrabox.tistory.com/72?category=814732
■ 트랜잭션 액세스 모드
트랜잭션 액세스 모드를 설정하려면 READ WRITE 또는 READ ONLY 절을 사용합니다. 동일한 SET TRANSACTION문에 여러 액세스 모드 절을 지정할 수 없습니다.
기본적으로 트랜잭션은 읽기/쓰기 모드에서 이루어지며, 트랜잭션에 사용된 테이블에 대한 읽기 및 쓰기가 모두 허용됩니다. 이 모드는 액세스 모드가 READ WRITE 인 SET TRANSACTION을 사용하여 명시 적으로 지정할 수 있습니다.
트랜잭션 액세스 모드가 읽기 전용으로 설정된 경우 테이블 변경이 금지됩니다. 이를 통해 스토리지 엔진은 쓰기가 허용되지 않을 때 가능한 성능을 향상시킬 수 있습니다.
읽기 전용 모드에서는 DML 문을 사용하여 TEMPORARY 키워드로 작성된 테이블을 변경할 수 있습니다. 영구 테이블과 마찬가지로 DDL 문으로도 변경할 수 없습니다.
또한 START TRANSACTION 문을 사용하여 개별 트랜잭션에 대해 READ WRITE 및 READ ONLY 액세스 모드를 지정할 수 있습니다.
■ 거래 특성 범위
트랜잭션 특성을 전체 범위, 현재 세션 또는 다음 트랜잭션에 대해서만 설정할 수 있습니다.
+ GLOBAL 키워드 사용 :
- 이 문법은 접속하는 다음 세션부터 전체적으로 적용됩니다.
- 기존 세션은 영향을받지 않습니다.
+ SESSION 키워드 사용 :
- 이 명령문은 현재 세션 내에서 수행된 모든 후속 트랜잭션에 적용됩니다.
- 명령문은 트랜잭션 내에서 허용되지만 현재 진행중인 거래에는 영향을 미치지 않습니다.
- 트랜잭션간에 실행되면 명령문은 이름이 지정된 특성의 다음 트랜잭션 값을 설정하는 이전 명령문을 겹쳐 씁니다.
+ 세션 또는 글로벌 키워드가없는 경우 :
- 명령문은 세션 내에서 수행된 다음 단일 트랜잭션에만 적용됩니다.
- 후속 트랜잭션은 이름이 붙여진 특성의 세션 값을 사용하여 되돌립니다.
- 거래 내역은 허용되지 않습니다 :
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.02 sec)
mysql> SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress
글로벌 트랜잭션 특성을 변경하려면 SUPER 권한이 필요합니다. 모든 세션은 세션특성 (트랜잭션 중간에도) 또는 다음 트랜잭션 특성 (트랜잭션 시작 이전)을 자유롭게 변경할 수 있습니다.
서버 시작시 전역 격리 수준을 설정하려면 명령줄 또는 옵션 파일에서 --transaction-isolation=level 옵션을 사용합니다. 이 옵션의 레벨 값은 공백 대신 대시를 사용하므로 허용 가능한 값은 READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ 또는 SERIALIZABLE입니다.
마찬가지로 서버 시작시 전역 트랜잭션 액세스 모드를 설정하려면 --transaction-read-only 옵션을 사용합니다. 기본값은 OFF (읽기 / 쓰기 모드)이지만 읽기 전용 모드의 경우 값을 ON으로 설정할 수 있습니다.
예를 들어 격리 수준을 REPEATABLE READ로 설정하고 액세스 모드를 READ WRITE로 설정하려면 옵션 파일의 [mysqld] 섹션에서 다음 줄을 사용합니다.
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
런타임시 전역, 세션 및 다음 트랜잭션 범위 레벨의 특성은 앞에서 설명한대로 SET TRANSACTION 문을 사용하여 간접적으로 설정할 수 있습니다. 또한 SET 문을 사용하여 transaction_isolation 및 transaction_read_only 시스템 변수에 값을 할당하여 직접 설정할 수도 있습니다.
+ SET TRANSACTION을 사용하면 다양한 범위 레벨에서 트랜잭션 특성을 설정하기위한 선택적 GLOBAL 및 SESSION 키워드를 사용할 수 있습니다.
+ transaction_isolation 및 transaction_read_only 시스템 변수에 값을 할당하기위한 SET 문에는 이러한 변수를 다른 범위 수준에서 설정하기위한 구문이 있습니다.
다음 표는 각 SET TRANSACTION 및 변수 할당 구문으로 설정된 특성 범위 레벨을 보여줍니다.
Table 1. 트랜잭션 특성에 대한 SET 구문
Syntax |
Affected Characteristic Scope |
SET GLOBAL TRANSACTION transaction_characteristic |
Global |
SET SESSION TRANSACTION transaction_characteristic |
Session |
SET TRANSACTION transaction_characteristic |
Next transaction only |
Table 2. 트랜잭션 특성에 대한 SET 구문
Syntax |
Affected Characteristic Scope |
SET GLOBAL var_name = value |
Global |
SET @@GLOBAL.var_name = value |
Global |
SET SESSION var_name = value |
Session |
SET @@SESSION.var_name = value |
Session |
SET var_name = value |
Session |
SET @@var_name = value |
Next transaction only |
런타임시 트랜잭션 특성의 글로벌 및 세션 값을 확인할 수 있습니다.
SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
MySQL 5.7.20 이전에는 transaction_isolation 및 transaction_read_only 대신 tx_isolation 및 tx_read_only를 사용하십시오.
'Databases > MySQL' 카테고리의 다른 글
[MySQL] 메모리 사용 최적화 (0) | 2020.09.16 |
---|---|
[MySQL] XA Transaction (0) | 2020.09.13 |
[MySQL] SAVEPOINT, ROLLBACK TO SAVEPOINT, 그리고 RELEASE SAVEPOINT문 (0) | 2020.09.08 |
[MySQL] Table Partitioning - MAXVALUE 파티션에 따른 테이블 재구성시 유의사항 (0) | 2020.09.07 |
[MySQL] START TRANSACTION, COMMIT, 그리고 ROLLBACK문 (0) | 2020.09.04 |