13.3.1 START TRANSACTION, COMMIT 및 ROLLBACK 구문
START TRANSACTION [transaction_characteristic
[,transaction_characteristic
] ...]transaction_characteristic
: WITH CONSISTENT SNAPSHOT | READ WRITE | READ ONLY BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1}
다음 문은 트랜잭션 의 사용을 제어 할 수 있습니다.
START TRANSACTION
또는BEGIN
새 트랜잭션을 시작합니다.COMMIT
는 현재 트랜잭션을 커밋하여 변경 사항을 영구적으로합니다.ROLLBACK
은 현재 트랜잭션을 롤백하여 변경을 취소합니다.SET autocommit
은 현재 세션의 기본 자동 커밋 모드를 활성화 또는 비활성화합니다.
기본적으로 MySQL은 자동 커밋 모드가 활성화 된 상태에서 작동합니다. 즉, 테이블을 갱신 (변경)하는 문을 실행하면 즉시, MySQL에 의해 갱신이 디스크에 저장되어 영구적입니다. 이 변경은 롤백 할 수 없습니다.
일련의 명령문에 대해 자동 커밋 모드를 암시 적으로 비활성화하려면 START TRANSACTION
문을 사용합니다.
START TRANSACTION; SELECT @A : = SUM (salary) FROM table1 WHERE type = 1; UPDATE table2 SET summary = @ A WHERE type = 1; COMMIT;
START TRANSACTION
을 사용하여 트랜잭션을 COMMIT
또는 ROLLBACK
으로 종료 될 때까지 자동 커밋이 비활성화 상태입니다. 그 후, 자동 커밋은 이전 상태로 돌아갑니다.
START TRANSACTION
은 트랜잭션의 특성을 제어하는 몇 가지 한정자가 허용됩니다. 여러 개의 한정자를 지정하려면 그들을 쉼표로 구분합니다.
WITH CONSISTENT SNAPSHOT
규정은이 기능을 지원하는 스토리지 엔진에서 일관성 읽기 를 시작합니다. 이것은InnoDB
에만 적용됩니다. 그 효과는 어떤InnoDB
테이블에서START TRANSACTION
계속SELECT
를 발행하는 것과 같습니다. 섹션 14.2.4 "일관성 비 록 읽기" 를 참조하십시오.WITH CONSISTENT SNAPSHOT
명령 옵션은 현재 트랜잭션 격리 수준 을 변경하지 않기 때문에 현재 격리 수준이 일관성 읽도록 허용하는 것이다 경우에만 일관된 스냅 샷을 제공합니다. 일관성 읽을 수 있도록 격리 수준은REPEATABLE READ
뿐입니다. 기타 모든 분리 레벨의 경우,WITH CONSISTENT SNAPSHOT
절은 무시됩니다.READ WRITE
및READ ONLY
한정자는 트랜잭션 액세스 모드를 설정합니다. 이들은 트랜잭션에서 사용되는 테이블에 대한 변경을 허용하거나 금지합니다.READ ONLY
제한은 트랜잭션이 다른 트랜잭션에 표시되는 트랜잭션 테이블과 비 트랜잭션 테이블 모두를 변경하거나 잠금을하지 않도록합니다. 이 트랜잭션은 계속 임시 테이블을 변경하거나 잠글 수 있습니다. 이러한 규정은 MySQL 5.6.5의 시점에서 사용할 수 있습니다.MySQL에서 트랜잭션이 읽기 전용 인 것을 알고 있다면,
InnoDB
테이블에 대한 쿼리의 추가 최적화가 가능합니다.READ ONLY
를 지정하면 읽기 전용 상태를 자동으로 확인할 수없는 경우에 이러한 최적화가 적용되는 것이 보증됩니다. 자세한 내용은 섹션 14.13.14 "InnoDB의 읽기 전용 트랜잭션 최적화" 를 참조하십시오.액세스 모드가 지정되어 있지 않으면 기본 모드가 적용됩니다. 기본이 변경되지 않는 한, 그것은 읽기 / 쓰기입니다. 같은 문에서
READ WRITE
와READ ONLY
모두를 지정하는 것은 허용되지 않습니다.읽기 전용 모드에서는 DML 문을 사용하여
TEMPORARY
키워드로 작성된 테이블은 계속 변경할 수 있습니다. 영구 테이블과 마찬가지로 DDL 문에 의해 수행되는 변경은 허용되지 않습니다.트랜잭션 액세스 모드에 대한 자세한 (기본 모드를 변경하는 방법을 포함)은 섹션 13.3.6 "SET TRANSACTION 구문" 을 참조하십시오.
read_only
시스템 변수가 활성화되어있는 경우 트랜잭션을START TRANSACTION READ WRITE
에서 명시 적으로 시작하려면SUPER
권한이 필요합니다.
MySQL 클라이언트 응용 프로그램을 작성하는 데 사용되는 많은 API (JDBC)는 클라이언트에서 START TRANSACTION
문을 보내는 대신 사용할 수있다 (또한 경우에 따라서는 사용해서는) 트랜잭션을 시작하기 위해 자신 방법을 제공합니다. 자세한 내용은 23 장 "Connector 및 API ' 또는 API 문서를 참조하십시오.
자동 커밋 모드를 명시 적으로 해제하려면 다음 문을 사용합니다.
SET autocommit = 0;
autocommit
변수를 0으로 설정하여 자동 커밋 모드를 해제 한 뒤, 트랜잭션 안전 테이블 ( InnoDB
또는 NDB
테이블 등)에 변경 사항이 즉시 영구가 될 수는 없습니다. COMMIT
을 사용하여 변경 사항을 디스크에 저장하거나 ROLLBACK
을 사용하여 변경 사항을 무시해야합니다.
autocommit
은 세션 변수이기 때문에 세션마다 설정해야합니다. 새 연결마다 자동 커밋 모드를 해제하려면 섹션 5.1.4 "서버 시스템 변수" 에있는 autocommit
시스템 변수의 설명을 참조하십시오.
BEGIN
과 BEGIN WORK
는 트랜잭션을 시작하는 START TRANSACTION
의 별칭으로 지원하고 있습니다. 표준 SQL 구문이다 START TRANSACTION
은 임시 트랜잭션을 시작하기 위해 권장되는 방법이며, BEGIN
에서 허용되지 않는 한정자가 허용됩니다.
BEGIN
문은 BEGIN ... END
복합 문을 시작하는 BEGIN
키워드의 사용과는 다릅니다. 후자는 트랜잭션을 시작하지 않습니다. 섹션 13.6.1 "BEGIN ... END 복합 문"부분 을 참조하십시오.
모든 저장 프로그램 (저장 프로 시저와 저장 함수, 트리거 및 이벤트)에서 파서는 BEGIN [WORK]
를 BEGIN ... END
블록의 시작으로 간주합니다. 이러한 맥락에서 대신 START TRANSACTION
을 사용하여 트랜잭션을 시작합니다.
옵션 WORK
키워드는 CHAIN
과 RELEASE
절과 마찬가지로, COMMIT
과 ROLLBACK
에 지원합니다. CHAIN
과 RELEASE
는 트랜잭션의 완료에 대한 추가 제어에 사용할 수 있습니다. completion_type
시스템 변수의 값은 기본 완료 동작이 결정됩니다. 섹션 5.1 "서버 시스템 변수" 를 참조하십시오.
AND CHAIN
절을 지정하면 현재 트랜잭션이 종료 되 자마자 새로운 트랜잭션이 시작되고 새로운 트랜잭션 격리 수준은 종료 트랜젝션과 동일합니다. RELEASE
절을 지정하면 서버는 현재 트랜잭션을 종료 한 뒤 현재의 클라이언트 세션을 분리합니다. NO
키워드를 포함하면 CHAIN
이나 RELEASE
완료를 억제됩니다. 이것은 completion_type
시스템 변수가 기본적으로 체인 또는 출시 완료가 실행되도록 설정되어있는 경우에 유용 할 수 있습니다.
트랜잭션을 시작하면 보류중인 트랜잭션이 커밋됩니다. 자세한 내용은 섹션 13.3.3 "암시 적 커밋을 발생시키는 문" 을 참조하십시오.
또한 트랜잭션을 시작하면 사용자가 UNLOCK TABLES
를 실행 한 것처럼, LOCK TABLES
에 의해 취득 된 테이블 잠금 해제됩니다. 트랜잭션을 시작하고도 FLUSH TABLES WITH READ LOCK
의해 취득 된 글로벌 읽기 잠금이 해제되지 않습니다.
최상의 결과를 얻기 위해 트랜잭션은 하나의 트랜잭션 지원 스토리지 엔진에 의해 관리되는 테이블만을 사용하여 실행하도록하십시오. 그렇지 않으면 다음과 같은 문제가 발생할 수 있습니다.
하나 이상의 트랜잭션 지원 스토리지 엔진 (
InnoDB
)에서 테이블을 사용 중이고 트랜잭션 격리 수준이SERIALIZABLE
않은 경우는 트랜잭션이 커밋 할 때 같은 테이블을 사용하는 다른 진행중인 트랜잭션 첫 번째 트랜잭션에 의해 변경된 내용의 일부만 표시되지 않을 수 있습니다. 즉, 혼합 된 엔진은 트랜잭션의 원 자성이 보장되지 않기 때문에 불일치가 발생할 수 있습니다. (혼합 엔진 트랜잭션의 빈도가 낮은 경우SET TRANSACTION ISOLATION LEVEL
을 사용하여 필요에 따라 각 트랜잭션 격리 수준을SERIALIZABLE
로 설정할 수 있습니다.)트랜잭션에서 트랜잭션 안전하지 않은 테이블을 사용하는 경우 자동 커밋 모드 상태에 관계없이 그 테이블에 변경이 번에 저장됩니다.
트랜잭션 내에서 비 트랜잭션 테이블을 업데이트 한 후
ROLLBACK
문을 실행하면ER_WARNING_NOT_COMPLETE_ROLLBACK
경고가 발생합니다. 트랜잭션 안전 테이블의 변경 내용은 롤백되지만 비 트랜잭션 안전 테이블의 변경 내용은 롤백되지 않습니다.
각 트랜잭션은 COMMIT
시 1 개의 정리로 바이너리 로그에 저장됩니다. 롤백 된 트랜잭션 로그에 기록되지 않습니다. (예외 : 비 트랜잭션 테이블의 변경 내용은 롤백 할 수 없습니다. 롤백되는 트랜잭션에 비 트랜잭션 테이블에 변경 사항이 포함되어있는 경우는 비 트랜잭션 테이블의 변경 내용이 확실하게 복제 할 수 있도록하기 위해 에 마지막으로 ROLLBACK
문을 사용하여 트랜잭션 전체가 기록됩니다.) 섹션 5.2.4 "바이너리 로그" 를 참조하십시오.
트랜잭션 격리 수준 또는 액세스 모드는 SET TRANSACTION
문을 사용하여 변경할 수 있습니다. 섹션 13.3.6 "SET TRANSACTION 구문" 을 참조하십시오.
롤백은 사용자가 명시 적으로 묻지 않고 (예를 들어, 오류 발생시) 암시 적으로 발생할 수있는 느린 조작이되는 경우가 있습니다. 따라서 ROLLBACK
문을 사용하여 실행 된 명시적인 롤백에뿐만 아니라 암시 롤백에 대해서도 SHOW PROCESSLIST
는 세션의 State
컬럼에 Rolling back
을 표시합니다.
MySQL 5.6에서는 BEGIN
, COMMIT
및 ROLLBACK
은 --replicate-do-db
또는 --replicate-ignore-db
규칙에 의해 영향을받지 않습니다.