본문 바로가기

Back-End 공부/Database

[Database] 트랜잭션 정의와 특징, TCL(COMMIT, ROLLBACK)

트랜잭션

MySQL/MariaDB의 InnoDB 스토리지 엔진은 Transaction(트랜잭션) 기능을 지원한다.

📌  Transaction

  • 하나의 논리적인 작업 단위로 처리되어야 하는 하나 이상의 SQL 문의 집합
  • 예시1) 은행 계좌 간에 이체를 할 때, 금액을 한 계좌에서 빼고 다른 계좌에 더하는 두 가지 연산은 한 작업의 단위로 처리되어야 하는 트랜잭션
  • 예시2) 주문을 하고 order테이블에 주문을 생성하고, item테이블에서 재고까지 빼주는 작업이 한 단위로 처리되어야 하는 트랜잭션

 

✅  트랜잭션 특징(ACID)

Atomicity(원자성)

  • 트랜잭션이 수행되던 도중 비정상적으로 종료되게 되면 종료되기 이전 정상적으로 수행되었던 작업이 데이터베이스에 반영된다면 데이터베이스를 신뢰할 수 없을 것이다.
  • 위에서 예시로 들었던 상황처럼 delete 는 정상적으로 수행이 되었고 insert 도중 에러가 발생했을 시 정상적으로 수행된 delete 만 반영이 되면 안되는 것이다. 아예 delete 하기 이전 상태로 돌아가야 한다.
  • 따라서, 트랜잭션을 통해 변경되는 데이터베이스의 신뢰성을 보장하기 위해 모든 트랜잭션 작업들이 정상적으로 수행된 후 반영되든지 모든 작업이 수행되지 않고 이전 데이터베이스 상태를 유지해야 한다.

Consistency(일관성)

  • 트랜잭션이 진행되는 동안에 데이터베이스가 변경되더라고 업데이트된 데이터베이스로 트랜잭션이 진행되는 것이 아니라, 처음에 트랜잭션을 진행하기 위해 참조한 데이터베이스로 진행된다.

Isolation(독립성)

  • 일련의 다른 트랜잭션 작업들이 동시에 수행되는 경우 각각의 트랜잭션 연산에 간섭없이 독립적으로 수행되어야 한다.
  • 하나의 특정 트랜잭션이 완료될때까지, 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다.

Durability(지속성)

  • 트랜잭션이 정상적으로 완료된 이후에는 데이터베이스 내에 작업이 영구적으로 반영되어 있어야 한다.

 

 

✅  TCL(COMMIT, ROLLBACK)

commit

  • COMMIT 명령은 한 트랜잭션의 모든 변경사항을 데이터베이스에 영구적으로 저장

rollback

  • ROLLBACK 명령은 트랜잭션의 변경사항을 모두 취소하고, 데이터베이스를 트랜잭션 시작 이전의 상태로 되돌리는 것
  • 일반적으로는 프로그램에서 논리적인 트랜잭션을 지정하고, 전체 commit 또는 전체 rollback하는 명령을 실행

 

💻 TRANSACTION 실습 

 

 
insert into board_test.author(id, name, email) values(2, 'test', 'test@naver,com');
COMMIT;
insert into board_test.post(title, contents, author_id) values('hello', 'hello is', 10);
ROLLBACK;
 

 

ROLLBACK시 COMMIT 이전의 명령어들만 결과에 반영된 상태로 돌아감