참고
MySQL Documentation 13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Statements
설명
- 트랜잭션을 컨트롤하는데 사용
syntax
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}
transaction_characteristic
READ WRITE
와READ ONLY
는 함께 쓰일 수 없다.
WITH CONSISTENT SNAPSHOT
- 트랜잭션을 consistent read 모드로 시작
- 트랜잭션 시작 시의 데이터를 기준으로 트랜잭션을 실행
- 트랜잭션 시작 후에 다른 트랜잭션으로 인해 데이터가 변경될 경우 undo log를 기준으로 재구축한다.
user_info
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| NULL | NULL |
+---------+-----------+
# 실행 순서 @1, @2, @3, @4
-- 세션 1
# @1
START TRANSACTION WITH CONSISTENT SNAPSHOT;
@3
SELECT *
FROM user_info;
-> 결과
user_info
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| NULL | NULL |
+---------+-----------+
@4
COMMIT;
-- 세션 2
@2
INSERT user_info(user_id, user_name)
VALUES (1, 'oliver');
READ WRITE
- 트랜잭션 access mode
- 기본값(변경되지 않았다면)
- 현재 트랜잭션이 테이블을 변경하는 것을 허용
READ ONLY
- 트랜잭션 access mode
- 현재 트랜잭션이 테이블을 변경하는 것을 제한
- temporary table은 변경 가능
-- 일반 테이블의 경우
user_info
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| NULL | NULL |
+---------+-----------+
START TRANSACTION READ ONLY;
# 실행시 error발생
INSERT user_info(user_id, user_name)
VALUES (1, 'oliver');
-- SQL Error [1792] [25006]: Cannot execute statement in a READ ONLY transaction.
COMMIT;
-- TEMPORARY TABLE의 경우
CREATE TEMPORARY TABLE user_info_copy(
user_id int NOT NULL,
user_name varchar(50) NOT NULL
);
START TRANSACTION READ ONLY;
# 정상 수행
INSERT user_info_copy(user_id, user_name)
VALUES (1, 'oliver');
COMMIT;
BEGIN
- START TRANSACTION의 alias, 트랜잭션을 시작
- BEGIN ... END compound statement와는 관련이 없다.
- START TRANSACTION이 표준 SQL syntax이다.
COMMIT
- 현재 트랜잭션의 변경사항을 영구적으로 저장
ROLLBACK
- 현재 트랜잭션의 변경사항을 취소
WORK
- 생략이 가능한 키워드, 특별한 역할은 없다.
AND CHAIN
- COMMIT과 ROLLBACK에 사용 가능
- 현재 트랜잭션을 종료하고 같은 트랜잭션 access mode(READ WRITE, READ ONLY)를 가지는 트랜잭션을 새롭게 시작
user_info
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| NULL | NULL |
+---------+-----------+
START TRANSACTION;
INSERT user_info(user_id, user_name)
VALUES (1, 'tom');
ROLLBACK AND CHAIN;
INSERT user_info(user_id, user_name)
VALUES (2, 'john');
COMMIT;
user_info
+---------+-----------+
| user_id | user_name |
+---------+-----------+
| 2 | john |
+---------+-----------+
RELEASE
- 현재 트랙잭션을 종료하고 현재 세션을 끊도록 함(disconnect)
START TRANSACTION;
SET @newUserName = 'michael'
INSERT user_info(user_id, user_name)
VALUES (3, @newUserName);
COMMIT RELEASE;
SELECT @newUserName;
+--------------+
| @newUserName |
+--------------+
| NULL |
+--------------+
SET autocommit
- 현재 세션의 autocommit 모드를 변경
0
: autocommit을 disable1
: autocommit을 enable