[DB] Transaction

2024. 4. 14. 23:13BE/DB

1. Transaction

 

  • 데이터베이스의 상태를 변화시키는 일종의 작업 단위

 

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

 

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

 

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

 

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

 

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

-- 변경
set autocommit = 1; -- on
set autocommit = 0; -- off

단, 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;
  • 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;

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;
  • 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 등등을 사용하기도 한다.

 

 

분산환경에서 DB 기본키(PK)는 어떤 ID 생성 전략으로 만들어야할까? (UUID,ULID,TSID...)

보통 개발 편의성을 위해 Oracle의 Sequence, MySQL의 auto_increment 로 숫자를 1씩 증가시키는 것으로 만든다. 이것은 어떤 문제점이 있을까? 외부에서 해당 시스템 PK를 예측하기 쉬워져서 SQL Injection 문

ssdragon.tistory.com


'BE > DB' 카테고리의 다른 글

[DB] VIEW  (0) 2024.06.22
[DB] INDEX  (1) 2024.04.15
[DB] SET Operator  (0) 2024.04.14
[DB] 내장함수  (0) 2024.04.14
[DB] NULL, CASE, ESCAPE  (0) 2024.04.14