EtoC
transaction 본문
transaction이란?
CS에서 트랜잭션은 더이상 쪼갤수없는 가장작은 엄무처리 단위
를 말한다.
DB에서 트랜잭션은 여러 SQL을 하나의 Operation으로 실행될 수록 있도록 하는 논리적 작업 단위로 데이터의 정합성을 보장한다.
즉, 데이터베이스의 상태를 변화시키기 위한 작업수행의 논리적 단위이다.
트랜잭션 사용시 범위를 최소화 해야한다. 비즈니스 로직의 시작부터 실행하는 것이 아니라 DBMS에 데이터를 저장하는 작업의 시작부터 걸어야한다. 연산이 길어지면 lock을 잡는 시간도 길어지고 최악의 경우엔 DB 커넥션 풀이 고갈될 수 있다.
트랜잭션의 성질(ACID)
1. 원자성(Atomicity)
트랜잭션은 All or nothing의 성질로, 연산이 중간에 중단되지 않는 것을 보장한다.
논리적인 작업 셋을 완벽하게 처리하거나 처리하지 못할 경우에는 원상태로 복구해서 적용되는 현상이 없도록 하는 것이다.
MySQL에서는 MVCC의 undo log를 이용하여 트랜잭션의 원자성을 보장한다.
MVCC란?
하나의 레코드에 대해 여러 버전을 관리하여 격리 수준에 따라 반환데이터를 달라지도록 하는 기능이다.
2. 일관성(Consistency)
트랜잭션이 성공적으로 종료(완료)되었을 때는 데이터의 무결성을 보장해야한다(데이터베이스는 여전히 일관된 상태여야 한다).
MySQL에서는 제약조건을 통해 일관성을 유지한다.
따라서 MySQL은 트랜잭션 격리수준 설정을 통해 여러 트랜잭션간의 작업 내용을 어떻게 공유하고 차단할지를 설정한다.
3. 격리성,독립성(Isolation)
둘 이상의 트랜잭션이 동시에 실행되는경우, 하나의 트랜잭션이 실행중이라면 실행 중인 트랜잭션의 중간결과에 다른 트랜잭션의 연산이 접근할 수 없고 수행중인 트랜잭션이 완전히 완료되어야 접근할 수 있다.
여러 트랜잭션이 실행중이어도 각각의 트랜잭션은 서로 간섭하지 않고 독립적으로 실행되어야한다.
독립성을 온전하게 보장하려면 각각의 트랜잭션이 순차적으로 실행되어야 하는데, 이는 동시성 성능 저하의 문제를 일으킨다.
- READ UNCOMMITED:
- READ COMMITED:
- REPEATABLE READ:
- SERIALABLE: 격리성이 가장 강하나 동시처리가 약하다. DB는 동시성처리가 중요하기때문에 READ COMMITED 격리성을 사용한다.
4. 영속성(Durability)
트랜잭션이 성공적으로 완료되면 그 결과는 유실되지 않고 DB에 영구적으로 반영되어야된다.
MySQL은 redo log를 통해 트랜잭션의 영속성을 보장한다.
트랜잭션의 연산
1. Commit
Commit 연산은 한개의 논리적 단위(트랜잭션)에 대한 작업이 성공적으로 끝났고 데이터베이스가 다시 일관된 상태에 있을 때, 이 트랜잭션이 행한 갱신 연산이 완료된 것을 트랜잭션 관리자에게 알려주는 연산이다.
2. Rollback
Rollback 연산은 하나의 트랜잭션 처리가 비정상적으로 종료되어 데이터베이스의 일관성을 깨뜨렸을 때, 이 트랜잭션의 일부가 정상적으로 처리되었더라도 트랜잭션의 원자성을 구현하기 위해 이 트랜잭션이 행한 모든 연산을 취소(Undo)하는 연산이다.
Rollback시 해당 트랜잭션을 재시작하거나 폐기한다.
트랜잭션의 상태
- 활동(Active) : 트랜잭션이 실행중인 상태
- 실패(Failed) : 트랜잭션 실행에 오류가 발생하여 중단된 상태
- 철회(Aborted) : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- 부분 완료(Partially Committed) : 트랜잭션의 마지막 연산까지 실행했지만, Commit 연산이 실행되기 직전의 상태
- 완료(Committed) : 트랜잭션이 성공적으로 종료되어 Commit 연산을 실행한 후의 상태