데이터베이스의 상태를 변화시키기 위해 수행하는 작업 단위로, 데이터베이스의 논리적 연산 단위입니다.
데이터의 일관성을 유지하면서 안정적으로 데이터를 복구하기 위한 기능입니다.
원자성: 정의된 연산들은 모두 성공적으로 실행 or 전혀 실행되지 않은 상태로 남아있어야 함
일관성: 트랜잭션이 실행되기 전의 데이터베이스 내용에 오류가 없다면 트랜잭션 실행 이후에도 오류가 있어서는 안됨
독립성: 복수의 트랜잭션이 동시에 실행되고 있는 경우에도 각 트랜잭션은 독립적으로 실행되어야 함
지속성: 트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 DB의 내용은 영구적으로 저장
Commit | Rollback |
---|---|
현재 상태를 데이터베이스의 최종 반영 | 작업이 실패. 이전 상태로 돌아감. |
하나의 트랜잭션이 성공적으로 완료 + 데이터베이스의 일관성이 유지되는 상태임을 알림 | COMMIT 되지 않은 상위의 모든 트랜잭션을 rollback |
트랜잭션에서 일관성 없는 데이터에 대한 허용 수준입니다. 데이터베이스에서는 독립성을 위해 복수의 트랜잭션이 데이터베이스에 접근하는 것을 제한(locking)해야 합니다. 그러나, 특정 시점에 오직 하나의 트랜잭션만 데이터베이스에 접근할 수 있도록 한다면 데이터베이스의 성능은 떨어지게 됩니다. (모든 트랜잭션을 순차적으로 처리하게 되므로)
따라서 효율적인 locking 방법이 필요합니다.
Read Uncommitted (level 0) | Read Committed (level 1) | Repeatable Read (level 2) | Serializable (level 3) |
---|---|---|---|
한 트랜잭션이 처리 중이거나 아직 commit되지 않은 데이터를 다른 트랜잭션이 접근 가능 | 트랜잭션이 현재 처리 중인 데이터에는 접근 불가 | 트랜잭션이 완료될 때까지 해당 데이터에는 접근 불가 | 트랜잭션들을 항상 순차적으로 처리 |
한 트랜잭션 내에서 같은 쿼리를 두 번 수행하는 상황을 가정해봅니다.
Non-Repeatable Read: 수행 도중에 다른 트랜잭션이 값을 수정 또는 삭제하는 바람에 동일한 두 쿼리의 결과가 다르게 나타나는 경우
Phantom Read: 첫번째 쿼리를 실행했을 때에는 없던 유령 레코드가 두번째로 쿼리를 실행했을 때 나타나는 현상
참고문헌
https://www.geeksforgeeks.org/transaction-isolation-levels-dbms/