Loading...
MySQL 9.5 Reference Manual 9.5의 15.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
START TRANSACTION, COMMIT, and ROLLBACK Statements
1START TRANSACTION 2 [transaction_characteristic [, transaction_characteristic] ...] 3 4transaction_characteristic: { 5 WITH CONSISTENT SNAPSHOT 6 | READ WRITE 7 | READ ONLY 8} 9 10BEGIN [WORK] 11COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 12ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] 13SET autocommit = {0 | 1}
이들 문장은 transactions 사용을 제어합니다:
START TRANSACTION 또는
BEGIN 은 새로운 트랜잭션을 시작합니다.
COMMIT 은 현재 트랜잭션을 커밋하여,
그 변경 사항을 영구적으로 만듭니다.
ROLLBACK 은 현재 트랜잭션을
롤백하여, 그 변경 사항을 취소합니다.
SET autocommit 은 현재 세션에 대해
기본 자동 커밋 모드를 비활성화하거나 활성화합니다.
기본적으로, MySQL은
autocommit 모드가 활성화된 상태로 실행됩니다.
이는 트랜잭션 내부가 아닐 때에는 각 문장이
START TRANSACTION 과 COMMIT 으로 둘러싸인 것처럼
원자적으로 처리된다는 의미입니다.
ROLLBACK 으로 그 효과를 취소할 수는 없습니다.
그러나 문장 실행 중에 에러가 발생하면,
해당 문장은 롤백됩니다.
단일 문장 시리즈에 대해 자동 커밋 모드를 묵시적으로
비활성화하려면, START TRANSACTION
문장을 사용합니다:
1START TRANSACTION; 2SELECT @A:=SUM(salary) FROM table1 WHERE type=1; 3UPDATE table2 SET summary=@A WHERE type=1; 4COMMIT;
START TRANSACTION 을 사용하면, COMMIT
또는 ROLLBACK 으로 트랜잭션을 종료할 때까지
자동 커밋은 비활성화된 상태로 유지됩니다.
그 후 자동 커밋 모드는 이전 상태로 되돌아갑니다.
START TRANSACTION 은 트랜잭션 특성을
제어하는 여러 모디파이어를 허용합니다. 여러 모디파이어를
지정하려면, 콤마로 구분합니다.
WITH CONSISTENT SNAPSHOT 모디파이어는
이를 지원 가능한 스토리지 엔진에 대해
consistent read 를 시작합니다.
이는 InnoDB 에만 적용됩니다. 이는
START TRANSACTION 을 실행한 후
어떤 InnoDB 테이블에 대해 SELECT 를 실행하는 것과
같은 효과를 가집니다.자세한 내용은
Section 17.7.2.3, “Consistent Nonlocking Reads” 를 참조하십시오. WITH CONSISTENT SNAPSHOT 모디파이어는 현재 트랜잭션
isolation level 을 변경하지 않으므로,
현재 격리 수준이 컨시스턴트 읽기를 허용하는 경우에만
컨시스턴트 스냅샷을 제공합니다.
컨시스턴트 읽기를 허용하는
격리 수준은 REPEATABLE READ 뿐입니다.
다른 모든 격리 수준에 대해서는,
WITH CONSISTENT SNAPSHOT 절이 무시됩니다.
WITH CONSISTENT SNAPSHOT 절이
무시되는 경우 경고가 생성됩니다.
READ WRITE 및 READ ONLY
모디파이어는 트랜잭션 액세스 모드를
설정합니다. 이들은 트랜잭션에서 사용되는 테이블에 대한
변경을 허용하거나 금지합니다.READ ONLY 제한은 다른 트랜잭션에서
볼 수 있는 트랜잭션 및 비트랜잭션 테이블을
트랜잭션이 수정하거나 잠그는 것을 방지합니다.
그러나 트랜잭션은 임시 테이블을 수정하거나
잠글 수 있습니다.
MySQL은 트랜잭션이 읽기 전용인 것으로 알려진 경우
InnoDB 테이블에 대한 쿼리에 대해 추가적인
최적화를 활성화합니다. 자동으로 읽기 전용 상태를
판단할 수 없는 경우에 READ ONLY 를 지정하면
이러한 최적화가 적용되도록 보장합니다.
자세한 내용은 Section 10.5.3, “Optimizing InnoDB Read-Only Transactions” 를 참조하십시오.
액세스 모드가 지정되지 않으면, 기본 모드가 적용됩니다.
기본값이 변경되지 않은 경우 읽기/쓰기가 됩니다.
하나의 문장에서 READ WRITE 와
READ ONLY 를 동시에 지정하는 것은 허용되지
않습니다.
읽기 전용 모드에서는, DML 문장을 사용하여
TEMPORARY 키워드로 생성된 테이블을 변경하는 것이
여전히 가능합니다. DDL 문장으로 수행되는 변경은,
영구 테이블과 마찬가지로 허용되지 않습니다.
트랜잭션 액세스 모드에 대한 추가 정보(기본 모드를 변경하는 방법 포함)는 Section 15.3.7, “SET TRANSACTION Statement” 를 참조하십시오.
read_only 시스템
변수가 활성화된 경우,
START TRANSACTION READ WRITE 로 트랜잭션을
명시적으로 시작하려면
CONNECTION_ADMIN 권한 (또는
폐기가 예정된 SUPER
권한)이 필요합니다.
주의
MySQL 클라이언트 애플리케이션을 작성하는 데 사용되는 많은
API(예: JDBC)는 클라이언트에서 START TRANSACTION
문장을 보내는 대신 사용할 수 있고(경우에 따라서는
그렇게 해야 하는) 자체 트랜잭션 시작 메서드를 제공합니다.
자세한 내용은 Chapter 31, Connectors and APIs 또는 사용 중인 API의 문서를 참조하십시오.
자동 커밋 모드를 명시적으로 비활성화하려면, 다음 문장을 사용합니다:
1SET autocommit=0;
autocommit 변수를 0으로 설정하여
자동 커밋 모드를 비활성화한 후에는,
InnoDB 또는
NDB 와 같은
트랜잭션 안전 테이블에 대한 변경이 즉시 영구적으로
저장되지 않습니다.
변경 내용을 디스크에 저장하려면
COMMIT 을,
변경을 무시하려면 ROLLBACK 을 사용해야 합니다.
autocommit 은 세션 변수이며
각 세션마다 설정해야 합니다. 각 새 커넥션에 대해
자동 커밋 모드를 비활성화하려면,
Section 7.1.8, “Server System Variables” 의
autocommit 시스템 변수 설명을
참조하십시오.
BEGIN 과 BEGIN WORK 는
트랜잭션을 시작하기 위한 START TRANSACTION 의
별칭으로 지원됩니다. START TRANSACTION 은
표준 SQL 구문이며, 애드혹 트랜잭션을 시작하는
권장 방식이고, BEGIN 에서는 사용할 수 없는
모디파이어를 허용합니다.
BEGIN 문장은
BEGIN ... END
복합 문장을 시작하는 BEGIN 키워드의
사용과는 다릅니다. 후자는 트랜잭션을 시작하지
않습니다.
자세한 내용은 Section 15.6.1, “BEGIN ... END Compound Statement” 를 참조하십시오.
참고
모든 스토어드 프로그램(스토어드 프로시저 및 함수,
트리거, 이벤트) 내에서는, 파서가
BEGIN [WORK] 를
BEGIN ... END 블록의 시작으로
처리합니다. 이 컨텍스트에서 트랜잭션을 시작하려면
START TRANSACTION 을 사용하십시오.
COMMIT 과 ROLLBACK 에 대해서는
선택적인 WORK 키워드와
CHAIN, RELEASE
절이 지원됩니다. CHAIN 과 RELEASE
는 트랜잭션 완료에 대한 추가 제어에 사용할 수 있습니다.
completion_type
시스템 변수의 값은 기본 완료 동작을 결정합니다.
자세한 내용은
Section 7.1.8, “Server System Variables” 를
참조하십시오.
AND CHAIN 절은 현재 트랜잭션이 종료되자마자
새로운 트랜잭션이 시작되도록 하며, 새 트랜잭션은
방금 종료된 트랜잭션과 동일한 격리 수준을
갖습니다. 새 트랜잭션은 또한 방금 종료된 트랜잭션과
동일한 액세스 모드(READ WRITE 또는 READ ONLY) 를 사용합니다.
RELEASE 절은 현재 트랜잭션을 종료한 후
서버가 현재 클라이언트 세션의 연결을 끊도록 합니다.
NO 키워드를 포함하면, 기본적으로
체이닝 또는 연결 종료 완료를 발생시키도록
completion_type 시스템
변수가 설정된 경우에도, CHAIN
또는 RELEASE 완료를 억제할 수 있습니다.
트랜잭션을 시작하면, 보류 중인 트랜잭션은 모두 커밋됩니다. 자세한 내용은 Section 15.3.3, “Statements That Cause an Implicit Commit” 를 참조하십시오.
트랜잭션을 시작하면,
LOCK TABLES 로
획득한 테이블 잠금도 마치
UNLOCK TABLES 를 실행한 것처럼 해제됩니다.
트랜잭션을 시작해도,
FLUSH TABLES WITH READ LOCK 으로 획득한
글로벌 읽기 잠금은 해제되지 않습니다.
최상의 결과를 얻으려면, 트랜잭션은 단일 트랜잭션 안전 스토리지 엔진이 관리하는 테이블만을 사용하여 수행해야 합니다. 그렇지 않으면 다음과 같은 문제가 발생할 수 있습니다:
InnoDB)
에서 테이블을 사용하고, 트랜잭션 격리 수준이
SERIALIZABLE 이 아닌 경우, 한 트랜잭션이
커밋될 때 동일한 테이블을 사용하는 다른 진행 중인
트랜잭션이 첫 번째 트랜잭션이 수행한 변경 사항 중
일부만 보게 될 수 있습니다.즉, 혼합 엔진에서는
트랜잭션의 원자성이 보장되지 않으며,
불일치가 발생할 수 있습니다. (혼합 엔진 트랜잭션이
드문 경우,
SET TRANSACTION ISOLATION LEVEL 을 사용하여
필요에 따라 트랜잭션 단위로 격리 수준을
SERIALIZABLE 로 설정할 수 있습니다.)
트랜잭션 내에서 트랜잭션 안전이 아닌 테이블을 사용하는 경우, 자동 커밋 모드의 상태와 관계없이 해당 테이블에 대한 변경은 즉시 저장됩니다.
트랜잭션 내에서 비트랜잭션 테이블을
업데이트한 후
ROLLBACK
문장을 실행하면,
ER_WARNING_NOT_COMPLETE_ROLLBACK
경고가 발생합니다. 트랜잭션 안전 테이블에 대한
변경은 롤백되지만, 트랜잭션 안전이 아닌 테이블에 대한
변경은 롤백되지 않습니다.
각 트랜잭션은
COMMIT 시점에 한 덩어리로 바이너리 로그에
저장됩니다. 롤백된 트랜잭션은 로깅되지 않습니다.
(예외: 비트랜잭션 테이블에 대한 수정은
롤백할 수 없습니다. 롤백된 트랜잭션에
비트랜잭션 테이블에 대한 수정이 포함된 경우,
비트랜잭션 테이블에 대한 수정이 복제되도록 보장하기
위해 전체 트랜잭션이 끝에
ROLLBACK 문장과 함께
로깅됩니다.) 자세한 내용은
Section 7.4.4, “The Binary Log” 를
참조하십시오.
SET TRANSACTION 문장을 사용하여
트랜잭션의 격리 수준이나 액세스 모드를 변경할 수
있습니다.
자세한 내용은 Section 15.3.7, “SET TRANSACTION Statement” 를 참조하십시오.
롤백은 사용자가 명시적으로 요청하지 않은 경우에도
(예: 에러 발생 시) 묵시적으로 발생할 수 있는,
느린 작업일 수 있습니다. 이 때문에,
SHOW PROCESSLIST 는 세션의 State
컬럼에 대해, ROLLBACK
문장으로 수행된 명시적 롤백뿐 아니라
묵시적 롤백에 대해서도 Rolling back 을
표시합니다.
참고
MySQL 9.5에서 BEGIN,
COMMIT, ROLLBACK 은
--replicate-do-db
또는 --replicate-ignore-db 규칙의
영향을 받지 않습니다.
InnoDB 가 트랜잭션을 완전히 롤백할 때,
트랜잭션이 설정한 모든 잠금은 해제됩니다. 중복 키
에러와 같은 에러로 인해 트랜잭션 내의 단일 SQL
문장이 롤백되는 경우, 트랜잭션이 활성 상태를
유지하는 동안 해당 문장이 설정한 잠금은 유지됩니다.
이는 InnoDB 가 각 행 잠금을, 어떤 문장이
해당 잠금을 설정했는지 사후에 알 수 없는 형식으로
저장하기 때문입니다.
트랜잭션 내의 SELECT 문장이
스토어드 함수를 호출하고, 스토어드 함수 내의
어떤 문장이 실패하면, 그 문장은 롤백됩니다.
이후 해당 트랜잭션에 대해
ROLLBACK 이
실행되면, 전체 트랜잭션이 롤백됩니다.
15.3 Transactional and Locking Statements
15.3.2 Statements That Cannot Be Rolled Back