본격적인 실습 진행 전에 MySQL에서 트랜잭션 관련 문법을 정리해보자.
일단 트랜잭션을 시작하기 전에 다음과 같이 Transaction Isolation Level 등을 설정해줘야 한다.
SET [GLOBAL | SESSION] TRANSACTION
transaction_characteristic [, transaction_characteristic] ...
transaction_characteristic: {
ISOLATION LEVEL level
| access_mode
}
level: {
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
access_mode: {
READ WRITE
| READ ONLY
}
*access_mode에서 READ ONLY을 주면 트랜잭션에서 테이블에 어떤 변경사항을 주는 것은 금지된다. 대신 이 모드를 설정하면 엔진이 성능 최적화를 한다.
다음과 같은 명시적인 SQL 문을 통해 트랜잭션을 시작하고 종료할 수 있다.
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}
*autocommit : 1로 설정되어 있으면 별도로 START TRANSACTION ~ COMMIT을 작성하지 않아도 마치 그 안에 있는 것처럼 모든 statement가 atomic하게 실행됨, 그래서 ROLLBACK을 실행할 수 없음, 하지만 만약 실행 중 에러가 발생하면 롤백되기는 함
START TRANSACTION이라고 쓰면 그 다음으로 COMMIT이나 ROLLBACK이 등장하기 전까지는 자동으로 autocommit 모드가 해제된다.
보통 Data Definition Language에 해당하는 구문들(CREATE/ DROP/ALTER TABLE 등), mysql 데이터베이스를 사용하는 것들(ALTER USER/GRANT 등)은 rollback할 수 없다.
다음과 같이 SAVEPOINT를 설정해서 SAVEPOINT 이전까지의 작업들만 rollback 하는 것도 가능하다.
SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier