13.3.6 SET TRANSACTION 구문
SET [GLOBAL | SESSION] TRANSACTIONtransaction_characteristic
[,transaction_characteristic
] ...transaction_characteristic
: ISOLATION LEVELlevel
| READ WRITE | READ ONLYlevel
: REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE
이 문은 트랜잭션 의 특성을 지정합니다. 이것은 쉼표로 구분 된 하나 이상의 특성 값의 목록을받습니다. 이러한 특성은 트랜잭션 격리 수준 또는 액세스 모드를 설정합니다. 분리 레벨은 InnoDB
테이블에 대한 조작에 사용됩니다. 액세스 모드는 MySQL 5.6.5의 시점에서 지정할 수 있으며, 트랜잭션이 읽기 / 쓰기 또는 읽기 전용의 두 모드에서 작동하는지 보여줍니다.
또한 SET TRANSACTION
명령문의 범위를 나타내는 옵션의 GLOBAL
또는 SESSION
키워드를 포함 할 수 있습니다.
트랜잭션의 특성의 범위
트랜잭션의 특성은 전 세계적으로 현재 세션 또는 다음 거래에 대해 설정할 수 있습니다.
GLOBAL
키워드를 지정하면이 문장은 이후의 모든 세션에 전체적으로 적용됩니다. 기존 세션은 영향을받지 않습니다.SESSION
키워드를 지정하면,이 문은 현재 세션에서 실행되는 이후의 모든 거래에 적용됩니다.SESSION
또는GLOBAL
키워드 모두 지정되지 않은 경우,이 문은 현재 세션에서 실행되는 다음 (시작되지 않은) 트랜잭션에 적용됩니다.
트랜잭션의 특성을 글로벌로 변경하려면 SUPER
권한이 필요합니다. 어떤 세션도 세션의 특성 (트랜잭션 도중에도) 또는 다음 트랜잭션의 특성을 자유롭게 변경할 수 있습니다.
활성 트랜잭션이 존재하는 동안은 GLOBAL
또는 SESSION
을 지정하지 SET TRANSACTION
은 허용되지 않습니다.
mysql>START TRANSACTION;
Query OK, 0 rows affected (0.02 sec) mysql>SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
ERROR 1568 (25001) : Transaction characteristics can not be changed while a transaction is in progress
서버 시작시 전역 기본 격리 수준을 설정하려면 명령 행 또는 옵션 파일에서 mysqld에 --transaction-isolation=
옵션을 사용합니다. 이 옵션의 level
level
값은 공백이 아닌 대시가 사용되므로 허용되는 값은 READ-UNCOMMITTED
, READ-COMMITTED
, REPEATABLE-READ
또는 SERIALIZABLE
입니다. 예를 들어, 기본 격리 수준을 REPEATABLE READ
로 설정하려면 옵션 파일의 [mysqld]
섹션에서 다음 줄을 사용합니다.
[mysqld] transaction-isolation = REPEATABLE-READ
글로벌 트랜잭션 격리 수준이나 세션의 트랜잭션 격리 수준은 tx_isolation
시스템 변수를 사용하여 런타임에 확인 또는 설정할 수 있습니다.
SELECT @@ GLOBAL.tx_isolation @@ tx_isolation; SET GLOBAL tx_isolation = 'REPEATABLE-READ'; SET SESSION tx_isolation = 'SERIALIZABLE';
마찬가지로, 서버 시작시 또는 실행시 트랜잭션 액세스 모드를 설정하려면 --transaction-read-only
옵션이나 tx_read_only
시스템 변수를 사용합니다. 기본적으로 이들은 OFF
(모드는 읽기 / 쓰기)이지만, ON
으로 설정하고 읽기 전용 기본 모드로 전환 할 수 있습니다.
tx_isolation
또는 tx_read_only
의 글로벌 또는 세션 값을 설정하는 것은 SET GLOBAL TRANSACTION
또는 SET SESSION TRANSACTION
에서 격리 수준 또는 액세스 모드를 설정하는 것과 같습니다.
분리 레벨의 자세한 내용과 사용 방법
InnoDB
는 여기에서 설명되는 각 트랜잭션 격리 수준을 다른 잠금 방법을 사용하여 지원하고 있습니다. ACID 준수가 중요한 요건이다 중요한 데이터에 대한 조작의 경우, 기본 REPEATABLE READ
수준을 사용하여 고급 일관성을 적용 할 수 있습니다. 또는 정확한 일관성과 반복 가능한 결과가 자물쇠를위한 오버 헤드의 양을 최소화만큼 중요하지 않다 일괄 보고서 등의 상황에서는 READ COMMITTED
이나 경우에 따라서는 READ UNCOMMITTED
를 사용하여 일관성 규칙을 완화 수 있습니다. SERIALIZABLE
은 REPEATABLE READ
보다 더 엄격한 규칙을 적용하고 주로 XA 트랜잭션 외에도 병렬성과 교착 상태 문제 해결의 특수한 상황에서 사용됩니다.
이 격리 수준이 InnoDB
트랜잭션 작동 방법에 대한 완전한 정보는 섹션 14.2.2 "InnoDB 트랜잭션 모델 및 잠금" 을 참조하십시오. 특히 InnoDB
의 레코드 수준 잠금 및 그것을 사용하여 다양한 종류의 문이 실행되는 방법의 자세한 내용은 섹션 14.2.6 "InnoDB 레코드 격차 및 넥스트 키 잠금" 및 섹션 14.2.8 "InnoDB의 다양한 SQL 문에서 설정된 잠금" 을 참조하십시오.
다음 목록은 MySQL이 각종 트랜잭션 수준을 어떻게 지원하는지에 대해 설명하고 있습니다. 이 목록은 가장 일반적으로 사용되는 수준에서 사용 빈도가 낮은 순서대로 정렬되어 있습니다.
REPEATABLE READ
이것이
InnoDB
의 기본 격리 수준입니다. 일관성 독해 에서는READ COMMITTED
격리 수준과 중요한 차이가 있습니다. 동일한 트랜잭션의 일관성 독해는 처음 읽기에 의해 설립 된 스냅 샷을 읽습니다. 이 규칙은 동일한 트랜잭션에서 여러 일반 (비 록)SELECT
문을 발행 한 경우 이러한SELECT
문은 서로에 대해서도 일관성이 있음을 나타냅니다. 섹션 14.2.4 "일관성 비 록 읽기" 를 참조하십시오.잠금 읽기 (
FOR UPDATE
또는LOCK IN SHARE MODE
를 포함한SELECT
),UPDATE
및DELETE
문의 경우, 잠금은 그 문이 고유 인덱스를 고유의 검색 조건 또는 범위 유형의 검색 조건 중 사용하고 있는지 따라 다릅니다. 고유의 검색 조건을 사용한 고유 인덱스의 경우,InnoDB
는 발견 된 인덱스 레코드 만 잠그고 그 앞에있는 갭 은 잠그지 않습니다. 기타 검색 조건의 경우,InnoDB
는 갭 잠금 또는 넥스트 키 잠금 을 사용하여 범위에 포함되는 갭에 다른 세션에서 삽입을 차단하여 스캔 된 인덱스 범위를 잠급니다.READ COMMITTED
일관성 (비 록) 읽기에 대해 다소 Oracle 비슷한 격리 수준입니다. 각 일관성 읽기 가 (같은 트랜잭션도) 자신의 새로운 스냅 샷 을 설정하고 읽습니다. 섹션 14.2.4 "일관성 비 록 읽기" 를 참조하십시오.
잠금 읽기 (
FOR UPDATE
또는LOCK IN SHARE MODE
를 포함한SELECT
)UPDATE
문 및DELETE
문의 경우,InnoDB
는 인덱스 레코드만을 잠 그어, 그 앞에있는 갭 은 락하지 않기 때문에 잠긴 레코드 옆에 새 레코드의 자유로운 삽입이 허용됩니다.참고MySQL 5.6에서는
READ COMMITTED
격리 수준이 사용되는 경우 또는 비추천의innodb_locks_unsafe_for_binlog
시스템 변수가 설정되어있는 경우, 외부 키 제약 조건 검사와 중복 키 체크를 제외하고,InnoDB
의 갭 잠금은 존재하지 않습니다. 또한 일치하지 않는 행에 대한 레코드 잠금도 MySQL이WHERE
조건을 평가 한 후에 해제됩니다.READ COMMITTED
를 사용하거나innodb_locks_unsafe_for_binlog
를 활성화하려면 행 기반의 바이너리 로깅을 사용해야합니다.READ UNCOMMITTED
SELECT
문은 비 잠금 방법으로 수행되지만 이전 버전의 행이 사용 될 수 있습니다. 따라서이 격리 수준을 사용하면 이러한 읽기에 일관성이 없습니다. 이것은 더티 읽기 라고도합니다. 그렇지 않으면이 격리 수준은READ COMMITTED
처럼 작동합니다.SERIALIZABLE
이 수준은
REPEATABLE READ
와 비슷하지만, 자동 커밋이 비활성화되어있는 경우,InnoDB
는 모든 일반SELECT
문을SELECT ... LOCK IN SHARE MODE
로 암시 적으로 변환합니다. 자동 위탁이 활성화되어있는 경우SELECT
자신의 트랜잭션입니다. 따라서 읽기 전용 인 것을 알고 있기 때문에 일관성있는 (비 록) 읽기로 실행 된 경우는 직렬화 할 수 다른 트랜잭션에 대한 차단이 필요하지 않습니다. (선택된 행이 다른 트랜잭션에 의해 변경된 경우 일반SELECT
강제로 차단하려면 자동 커밋을 비활성화합니다.)
트랜잭션 액세스 모드
MySQL 5.6.5의 시점에서는 트랜잭션 액세스 모드는 SET TRANSACTION
으로 지정할 수 있습니다. 기본적으로 트랜잭션은 읽기 / 쓰기 모드에서 실행되는 트랜잭션에서 사용되는 테이블에 대한 읽기 및 쓰기가 허용됩니다. 이 모드는 READ WRITE
액세스 모드를 사용하여 명시 적으로 지정할 수 있습니다.
트랜잭션 액세스 모드가 READ ONLY
로 설정되어있는 경우, 테이블에 변경이 금지됩니다. 이렇게하면 쓸 수 있지 않은 경우에 가능하다 스토리지 엔진의 성능 향상이 실현 될 가능성이 있습니다.
같은 문에서 READ WRITE
와 READ ONLY
모두를 지정하는 것은 허용되지 않습니다.
읽기 전용 모드에서는 DML 문을 사용하여 TEMPORARY
키워드로 작성된 테이블은 계속 변경할 수 있습니다. 영구 테이블과 마찬가지로 DDL 문에 의해 수행되는 변경은 허용되지 않습니다.
READ WRITE
및 READ ONLY
액세스 모드는 START TRANSACTION
문을 사용하여 개별 트랜잭션에 지정할 수 있습니다.