[DB] Transaction

1. Transaction

  • 데이터베이스의 상태를 변화시키는 일종의 작업 단위
트랙잭션 도구설명
START TRANSACTION트랜잭션을 시작하는 명령어
COMMIT수정된 내용을 데이터베이스에 반영하는 명령어
ROLLBACK트랜잭션에서 수행된 모든 변경을 원래대로 되돌리는 명령어
SAVEPOINT롤백을 원하는 특정 시점을 지정하는 명령어

mysql은 기본적으로 autocommit으로 설정되어 있다.

autocommit이면 실행과 동시에 데이터베이스에 변화를 반영한다.

끄면 commit 전까진 메모리 상에서만 데이터를 변경하고 실제 데이터베이스에선 변화하지 않는다.

-- 확인
select @@autocommit; -- 1인 경우 autocommit

-- 변경
set autocommit = 1; -- on
set autocommit = 0; -- off
Code language: JavaScript (javascript)

단, DCL, DML의 autocommit은 풀 수 없다.


가. COMMIT

start transaction;

insert into tc_test
values ('a');

insert into tc_test
values ('b');

insert into tc_test
values ('c');

insert into tc_test
values ('e');

insert into tc_test
values ('f');

commit;
Code language: JavaScript (javascript)
  • commit : 모두 데이터베이스에 반영된다.

나. ROLLBACK

start transaction;

insert into tc_test
values ('a');

insert into tc_test
values ('b');

insert into tc_test
values ('c');

insert into tc_test
values ('e');

insert into tc_test
values ('f');

rollback;
commit;
Code language: JavaScript (javascript)

a, b, c, d, e, f 모두 데이터베이스에 안 들어감.


다. SAVEPOINT

start transaction;

insert into tc_test
values ('a');

insert into tc_test
values ('b');

insert into tc_test
values ('c');

savepoint p1;

insert into tc_test
values ('e');

insert into tc_test
values ('f');

rollback to p1;
commit;
Code language: JavaScript (javascript)
  • savepoint p1; : 세이브포인트를 지정한다.
  • rollback to p1; : e, f는 없었던 일이 된다.

라. AUTO_INCREMENT와 ROLLBACK

MySQL에서는 AUTO_INCREMENT는 롤백되지 않는다.

InnoDB의 AUTO_INCREMENT 값은 한번 사용되면 트랜잭션이 ROLLBACK되어도, 이미 사용된 AUTO_INCREMENT 값은 복구되지 않는다.

ROLLBACK을 실행해도 AUTO_INCREMENT의 다음 숫자는 rollback 이전과 같다.

그래서 AUTO_INCREMENT 대신에 서브쿼리, UUID 등등을 사용하기도 한다.

https://ssdragon.tistory.com/162


댓글 남기기