데이터베이스에서 트랜잭션이란 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위이다.
트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다.
트랜잭션은 나눌 수 없는 하나의 작업이라는 특징이다.
All or Nothing
트랜잭션이 중간에 문제가 생기면 없던 일로 DB에 반영하지 않는다.
트랜잭션의 작업 처리로 인하여 데이터베이스 상태의 일관성이 어긋나서는 안된다. 예를 들어, 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다.
동시에 실행하는 트랜잭션끼리는 서로에게 영향을 미치지 않도록 격리한다. 다른 트랜잭션과 동시에 실행했더라도 동시에 같은 데이터를 수정하지 못하도록 해야 한다.
단, 격리 수준은 동시성과 관련된 성능 이슈로 인하여 DBMS에 따라서 옵션으로 어느정도 격리시킬지 격리 수준은 정할 수 있다.
트랜잭션을 성공적으로 끝내면 그 결과가 항상 기록되어야 한다. 중간에 시스템에 문제(물리적으로 전원이 꺼지는 상황 등..)가 발생해도 데이터베이스 로그 등을 사용해서 성공한 트랜잭션 내용을 복구해야한다.
즉, COMMIT
한 데이터 영구적으로 반영되어야하며, 어떤 문제가 생기더라도 복구할 수 있어야 한다.
트랜잭션의 격리성을 보장하기 위해서는 트랜잭션을 거의 차례대로 실행해야 한다. 병렬 처리를 거의 할 수 없어 동시성 처리 성능이 매우 나빠진다. 이런 문제로 인하여 ANSI 표준은 트랜잭션의 격리 수준을 4단계로 나누어 정의했다.
격리 수준 | Dirty Read | Non-Repeatable Read | Phantom Read |
---|---|---|---|
Read Uncommitted | O | O | O |
Read Committed | O | O | |
Repeatable Read | O | ||
Serializable |
A 트랜잭션에서 작업이 다 끝나지 않았지만 다른 트랜잭션에서 A 트랜잭션의 작업 내용을 볼 수 있는 것
하나의 트랜잭션에서 두번의 동일한 조회를 하였을 때, 다른 트랜잭션의 커밋으로 인하여 서로 다른 결과가 조회되는 것
하나의 트랜잭션에서 두번의 동일한 조회를 하였을 때, 다른 트랜잭션의 Insert로 인해 없던 데이터가 조회되는 것
트랜잭션이 커밋하지 않은 내용까지 읽겠다는 격리 수준으로 Dirty Read, Non-Repeatable Read, Phatom Read의 문제를 모두 가지고 있다.
트랜잭션이 커밋한 내용은 모두 읽겠다는 격리 수준으로 반복 조회를 하는 순간 문제가 생긴다. Non-Repeatable Read, Phantom Read 문제를 가지고 있다.
반복 조회시 다른 트랜잭션에 의하여 변경된 사항을 읽지 않겠다는 것이다. 다만 다른 트랜잭션에 의하여 추가된 사항은 반복 조회를 통해 조회될 수 있다. 즉, Phantom Read 문제가 있다.
모든 트랜잭션을 순서대로 실행하겠다는 것이다. 하나의 한 트랜잭션만 실행하므로 어떤 문제도 발생하지 않으나 성능이 급격하게 떨어진다.
어플리케이션 대부분은 동시성 처리가 중요하므로 데이터베이스들은 보통 Read Committed
격리 수준을 기본으로 사용한다.
https://velog.io/@hyunjong96/%ED%8A%B8%EB%9E%9C%EC%9E%AD%EC%85%98-%EA%B2%A9%EB%A6%AC-%EC%88%98%EC%A4%80Isolation-level
자바 ORM 표준 JPA 프로그래밍 16장