[MySQL] SET TRANSACTION 문

■ 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

 

[MySQL][InnoDB]잠금(Locking)과 트랜잭션 격리수준(Isolation Level)

■ 트랜잭션 격리 수준 [Isolation Level] 트랜잭션 격리는 데이터베이스 처리의 기초 중 하나입니다. 격리는 약어 ACID의 I입니다. 격리 수준은 여러 트랜잭션이 동시에 변경하고 쿼리를 수행 할 때 ��

myinfrabox.tistory.com

 

트랜잭션 액세스 모드

트랜잭션 액세스 모드를 설정하려면 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 사용하십시오.

Designed by JB FACTORY