[MySQL] START TRANSACTION, COMMIT, and ROLLBACK Statements

참고

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 WRITEREAD 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

  • COMMITROLLBACK에 사용 가능
  • 현재 트랜잭션을 종료하고 같은 트랜잭션 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을 disable
  • 1: autocommit을 enable

links

social