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}
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
문장뿐만 아니라 내재 롤백 대한.
'프로그램 > MySql' 카테고리의 다른 글
MySQL - alter table 명령어 모음 (0) | 2016.12.07 |
---|---|
분실한 mysql root password 재설정하기 (0) | 2016.12.01 |
[MySQL]사용자 계정 생성 및 삭제 (0) | 2016.11.29 |
MYSQL 사용자 생성 (0) | 2016.11.29 |
PASSWORD()와 OLD_PASSWORD() 함수 그리고 old_passwords 설정 (0) | 2016.11.28 |