Transaction(트랜잭션)
질의(query)를 하나의 묶음 처리
해서 만약 중간에 실행이 중단됐을 경우,
처음부터 다시 실행하는 Rollback을 수행하고, 오류없이 실행을 마치면 commit을 하는 실행 단위를 의미합니다. (all-or-nothing, Transaction의 원자성 단위)
즉, 한 번 질의가 실행되면
질의가 모두 수행되거나 모두 수행되지 않는 작업수행의 논리적 단위
가 트랜잭션이다.
사용하는 이유
Transaction은 DB 서버에 여러 개의 클라이언트가 동시에 액세스 하거나 응용프로그램이 갱신을 처리하는 과정에서 중단될 수 있는 경우 등 데이터 부정합을 방지
하고자 할 때 사용합니다.
참고로, DBMS의 성능은 초당 트랜잭션의 실행 수(TPS
: Transaction per second)로 측정합니다.
ACID
: 트랜잭션의 특징들의 앞글자를 딴 단어입니다.
Atomicity(원자성)
- 모든 작업이 반영(커밋)되거나 모두 롤백되는 특성입니다
- 즉, All or Noting의 개념으로서 작업 단위를 일부분만 실행하지 않는다는 것을 의미
- 트랜잭션(Transaction)이 원자성의 단위이다!
- MySQL(8.0)에서는 MVCC의 undo log로 작업한 내용을 저장하고 트내잭션이 실패서 롤백할 때 여기서 가져와서 원자성을 지킨다.
Consistency(일관성)
- 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지하는 것을 말합니다.
- 즉, 제약조건(constraint)으로 트랜잭션으로 작업한 데이터들의 무결성을 지킬 수 있다.
- 예를 들어, Int타입 컬럼에 Varchar타입값은 저장이 안되도록 보장해줘야 하는 의미.
Isolation(고립성)
- A와 B 두개의 트랜젝션이 실행되고 있을 때, A의 작업과 B작업이 모두 서로 영향을 주면 안됩니다.
- 하지만 이는 성능과 trade off 할 수 있는 지점이라 개발자가 직접 설정할 수 있다. 바로, 트랜잭션 격리 레벨(Isolation Level)로.
MySQL 트랜잭션 격리 레벨(Isolation Level)
Trade off
- Read Committed: 트랜잭션내에서 커밋된 데이터만 다른 트랜잭션이 읽는 것을 허용
- Repeatable Read: 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 결과는 동일
- 주로, Read Committed, Repeatable Read(데드락 이슈 있음) 를 씀.
Durability(영구성)
- 한번 반영(커밋)된 트랜젝션의 내용은 영원히 적용되는 특성을 의미합니다.
- 즉, 데이터가 유실되지 말아야 한다.
Transaction의 Lock
참고
https://chrisjune-13837.medium.com/db-transaction-%EA%B3%BC-acid%EB%9E%80-45a785403f9e