14.3.1 START 트랜잭션이 COMMIT 및 ROLLBACK 구문

START 거래
    [ transaction_characteristic[, transaction_characteristic] ...]

transaction_characteristic:
    일관성 스냅 샷
  | 읽기 쓰기
  | 읽기 전용

[WORK]를 BEGIN
COMMIT [WORK]와 [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK]와 [NO] CHAIN] [[NO] RELEASE] 없습니다
SET의 자동 커밋 = {0 | 1}

이 문은 사용을 제어 제공하는  거래를 :

  • START TRANSACTION 또는  BEGIN 새 트랜잭션을 시작합니다.

  • COMMIT 그 변경 사항을 영구적하고, 현재의 트랜잭션 (transaction)을 범했습니다.

  • ROLLBACK 롤의 변경을 취소, 현재의 트랜잭션 (transaction)를 백업합니다.

  • SET autocommit 비활성화 또는 현재 세션에 대한 기본 자동 커밋 모드를 가능하게한다.

기본적으로 MySQL은 실행됩니다  자동 커밋  활성화 모드. 이것은 바로 디스크에 대한 업데이트 (수정) 테이블, MySQL의 저장 업데이트가 영구적으로하는 문을 실행으로 있다는 것을 의미한다. 변화는 롤백 할 수 없습니다.

문 하나의 시리즈에 대한 암시 적으로 자동 커밋 모드를 해제하려면 사용  START TRANSACTION 문 :

트랜잭션을 시작;
SELECT @A가 : 표 FROM SUM (급여) = WHERE 유형 = 1;
UPDATE 표 2 SET 요약 = @ WHERE 유형 = 1;
범하다;

으로  START TRANSACTION당신과 거래를 종료 할 때까지, 자동 커밋이 비활성화 된 상태로 남아 COMMIT 나  ROLLBACK. 자동 커밋 모드는 이전 상태로 되돌아갑니다.

START TRANSACTION 트랜잭션 특성을 제어하는 ​​여러 가지 개질제를 허용한다. 여러 수식을 지정하려면 쉼표로 구분합니다.

  • WITH CONSISTENT SNAPSHOT 수정은 시작  일관된 읽기  그것을 할 수있는 스토리지 엔진을. 이 경우에만 적용됩니다  InnoDB. 효과는 발행과 동일  START TRANSACTION a로 다음을 SELECT 어떤에서  InnoDB 테이블. 참조  절 15.5.2.3를, "일관된 Nonlocking 읽고" . WITH CONSISTENT SNAPSHOT 수정은 현재의 트랜잭션 (transaction) 변경되지 않는  격리 수준을 , 그래서 현재 격리 수준이 일관된 읽기를 허용 한 경우에만이 일관된 스냅 샷을 제공합니다. 일관된 읽기를 허용하는 유일한 격리 수준이다  REPEATABLE READ. 다른 분리 레벨의 경우,  WITH CONSISTENT SNAPSHOT절은 무시됩니다. 때 MySQL은 5.7.2로, 경고가 생성됩니다  WITH CONSISTENT SNAPSHOT 절이 무시됩니다.

  • READ WRITE 및  READ ONLY 수정 트랜잭션 액세스 모드를 설정합니다. 그들은 허용하거나 트랜잭션에 사용되는 테이블에 대한 변경을 금지합니다. READ ONLY제한은 수정하거나 다른 트랜잭션에 볼 수 있습니다 모두 트랜잭션 및 비 트랜잭션 테이블 잠금에서 거래를 방지; 거래는 여전히 수정하거나 임시 테이블을 잠글 수 있습니다.

    MySQL은에 쿼리에 대한 별도의 최적화를 가능하게  InnoDB 트랜잭션이 읽기 전용으로 알려져있다 테이블. 지정은  READ ONLY 이러한 최적화가 읽기 전용 상태가 자동으로 판별 할 수없는 경우에 적용됩니다 보장합니다. 참조  섹션 9.5.3을, "최적화 InnoDB의 읽기 전용 거래" 더 많은 정보를 얻을 수 있습니다.

    접근 모드를 지정하지 않으면, 디폴트 모드가 적용된다. 기본이 변경되지 않는 한, 그것은 읽기 / 쓰기. 모두를 지정하는 것은 허용되지 않습니다  READ WRITE 과  READ ONLY 같은 성명에서.

    읽기 전용 모드에서, 그것은으로 만든 테이블을 변경할 수 남아  TEMPORARY DML 문을 사용하여 키워드를. DDL 문으로 변경은 영구 테이블로, 허용되지 않습니다.

    기본 모드를 변경하는 방법을 포함하여 트랜잭션 액세스 모드에 대한 자세한 내용은 다음을 참조 섹션 14.3.6, "SET 트랜잭션 구문"을 .

    경우  read_only 시스템 변수가 사용 가능으로, 명시 적으로 트랜잭션을 시작  START TRANSACTION READ WRITE 요구  SUPER 권한을.

중대한

(예 : JDBC 등) MySQL 클라이언트 응용 프로그램을 작성에 사용되는 대부분의 API는 (때로는한다) 대신에 보내는 사용할 수 있습니다 트랜잭션을 시작하는 자신의 방법을 제공하는  START TRANSACTION 클라이언트에서 문을. 참조  25 장,  커넥터 및 API에 대한 자세한 내용은, 당신의 API에 대한, 또는 문서를.

명시 적으로 자동 커밋 모드를 해제하려면 다음 문을 사용합니다 :

SET의 자동 커밋 = 0;

설정에 따라 자동 커밋 모드를 해제 한 후  autocommit 제로 변수 (예에 대한 것과 같은 트랜잭션 안전 테이블의 변경  InnoDB 또는  NDB) 즉시 영구적으로하지 않습니다. 당신은 사용해야  COMMIT 디스크에 변경 사항을 저장하거나  ROLLBACK 변경 사항을 무시.

autocommit 세션 변수이며, 각 세션에 대해 설정해야합니다. 각각의 새로운 연결을 위해 자동 커밋 모드를 사용하지 않으려면의 설명을 참조하십시오  autocommit에서 시스템 변수를  제 6.1.5, "서버 시스템 변수" .

BEGIN 과  BEGIN WORK 의 별칭으로 지원되는  START TRANSACTION 트랜잭션을 시작합니다. START TRANSACTION 표준 SQL 구문이고, 임시 트랜잭션을 시작하는 좋은 방법이며, 수정 허용 BEGIN 하지 않습니다.

BEGIN 문은 사용과 다른  BEGIN 시작 키워드  BEGIN ... END 화합물 문을. 후자는 트랜잭션을 시작하지 않습니다. 참조 섹션 14.6.1를, "BEGIN ... END 복합 문 구문" .

노트

저장된 모든 프로그램 (저장 프로 시저 및 함수, 트리거, 이벤트), 파서 취급 이내  BEGIN [WORK] (a)의 시작으로  BEGIN ... END 블록. 와이 컨텍스트에서 트랜잭션을 시작  START TRANSACTION 하는 대신.

옵션  WORK 키워드에 대한 지원  COMMIT 및  ROLLBACK한,  CHAIN 그리고  RELEASE 절을. CHAIN 및 RELEASE 거래 완료 추가 제어에 사용될 수있다. 의 값은  completion_type 시스템 변수는 기본 완료 동작을 결정합니다. 참조  섹션 6.1.5, "서버 시스템 변수"를 .

AND CHAIN 절은 현재 종료하자마자 시작 새로운 트랜잭션을 발생, 새로운 트랜잭션 방금 종료 트랜잭션과 같은 분리 레벨을 갖는다. RELEASE 절은 현재 트랜잭션을 종료 한 후 현재 클라이언트 세션을 분리하도록 서버를 발생합니다. 포함  NO 키워드를 억제  CHAIN 또는  RELEASE 경우에 유용 할 수 있습니다 완료,  completion_type 시스템 변수가 체인의 원인 또는 기본적으로 완료를 해제하도록 설정되어 있습니다.

트랜잭션을 시작하면 보류중인 트랜잭션이 커밋됩니다. 참조  섹션 14.3.3, "는 암시 적 커밋 원인 문" 자세한 내용을.

트랜잭션을 시작도 함께 획득 한 테이블 잠금이 발생  LOCK TABLES 하면 실행했던 것처럼, 발매 예정을  UNLOCK TABLES. 트랜잭션을 시작하기로 취득하는 글로벌 읽기 잠금을 해제하지 않습니다  FLUSH TABLES WITH READ LOCK.

최상의 결과를 얻으려면, 거래는 하나의 거래 안전 스토리지 엔진에 의해 관리 만 테이블을 사용하여 수행해야합니다. 그렇지 않으면, 다음과 같은 문제가 발생할 수있다 :

  • 둘 이상의 트랜잭션 안전 저장 엔진 (예에서 테이블을 사용하는 경우  InnoDB) 및 트랜잭션 격리 수준되지 않습니다  SERIALIZABLE, 하나의 트랜잭션이 커밋 할 때 같은 테이블을 사용하는 다른 지속적인 거래 만 일부 변경을 볼 가능성이있다 첫 번째 트랜잭션에 의해 만들어진. 즉, 트랜잭션의 원 자성이 혼합 된 엔진과 발생할 수 있습니다 일관성을 보증 할 수 없습니다. (혼합 엔진 트랜잭션이 빈번하지 않으면 사용할 수  SET TRANSACTION ISOLATION LEVEL 로 분리 레벨을 설정할  SERIALIZABLE 필요에 따라 트랜잭션 단위에서).

  • 당신이 트랜잭션 내에서 트랜잭션 안전하지 않은 테이블을 사용하는 경우, 해당 테이블의 변경에 관계없이 자동 커밋 모드의 상태를 한 번에 저장됩니다.

  • 당신이 실행하는 경우  ROLLBACK 트랜잭션 내에서 비 트랜잭션 테이블을 업데이트 한 후 문을 ER_WARNING_NOT_COMPLETE_ROLLBACK 경고가 발생합니다. 트랜잭션 안전 테이블에 대한 변경 사항은 nontransaction 안전 테이블에 대한 변경 사항을 롤백하지만되지 않습니다.

각 트랜잭션에, 한 덩어리에 바이너리 로그에 저장됩니다  COMMIT. 롤백 트랜잭션은 기록되지 않습니다. ( 예외 :. 비 트랜잭션 테이블에 대한 수정은 롤백 할 수 없습니다 롤백 트랜잭션이 비 트랜잭션 테이블에 대한 수정이 포함 된 경우, 전체 트랜잭션이 함께 기록됩니다  ROLLBACK비 트랜잭션 테이블에 대한 수정이 복제되도록 끝에 문.) 참조  섹션 6.4.4, "바이너리 로그" .

당신은와의 거래에 대한 격리 수준 또는 액세스 모드를 변경할 수 있습니다  SET TRANSACTION 문을.참조  섹션 14.3.6, "SET 트랜잭션 구문"을 .

위로 롤링 (오류가 발생하면, 예를 들어)을 명시 적으로 요청하는 데 사용하지 않고 암시 적으로 발생할 수있는 느린 동작 할 수있다. 이 때문에,  SHOW PROCESSLIST 표시  Rolling back 에서  State 세션의 열뿐만 아니라, 명시 적으로 수행 롤백 용  ROLLBACK 문장뿐만 아니라 내재 롤백 대한.


+ Recent posts