트랜잭션은 ACID 를 보장해야한다.
- 원자성 Actomocity
트랜잭션내 실행한 작업들은 모두 성공하거나, 실패시 실행전으로 돌아가야한다- 일관성 Consistency
트랜잭션내 변경사항은 일관성있는 데이터베이스 상태를 유지 해야한다. 그럴 수 없다면, 해당 변경사항은 적용되면 안된다.- 격리성 Isolation
동시에 실행되는 read/write 은 서로에게 영향을 미쳐서는 안된다.
격리성은 동시성과 관련된 성능 이슈로인해 격리 수준을 선택할 수 있다.- 지속성 Durability
트랜잭션간 발생한 변경사항은 기록되어야한다. 중간에 에러가 발생하여 실패할지라도 기록된 내용을 바탕으로 복구할 수 있어야한다.
격리 수준 DIRTY READ NON-REPEATABLE READ PHANTOM READ READ UNCOMMITED O O O READ COMMITED O O REPEATABLE READ O SERIALIZABLE DIRTY READ : 커밋하지 않는 데이터를 읽을 수 있다. 예를 들어, 트랜잭션1 이 데이터를 수정하는 도중에 커밋이되지 않았어도 트랜잭션2가 해당 데이터를 읽을 수 있다.
NON-REPEATABLEREAD : 트랜잭션이 같은 로우 데이터를 두번 읽었을때 다른 결과물을 받는 경우를 뜻한다. 만약 트랜잭션1이 어떤 로우를 읽고, 트랜잭션2 가 해당 로우를 업데이트 하거나 지우면, 트랜잭션1이 다시 읽었을때 다른 결과 값이 사라져버린 로우를 발견하게 된다.
PHANTOM READ : 반복적으로 같은 쿼리를 실행해도, 결과 집합이 달라지는 것이다.
- NON-REPEATABLEREAD 와 PHANTOM READ 의 차이점이 헷갈릴 수도 있다. 설명만 듣고는 나도 모르겠다... https://stackoverflow.com/questions/11043712/what-is-the-difference-between-non-repeatable-read-and-phantom-read
잘설명되있는 stackoverflow 를 참조하자.- 어플리케이션 대부분은 동시성 처리가 중요하므로 DB들을 대체로 READ COMMITED 격리 수준을 기본으로 사용한다.