데이터베이스의 상태를 변화시키기위해 수행하는 최소 작업의 단위.(CRUD)
데이터를 조작하는 작업의 단위.
원자성(Atomicity): 트랜잭션에 속한 작업들이 모두 수행되었는지 아니면 모두 실행이 안되었는지를 보장하는 능력이다. 즉, 중간 단계까지 실행되고 실패하는 일은 없도록 하는 것이다.
일관성(Consistency)은 트랜잭션이 실행을 성공적으로 완료하면 언제나 일관성 있는 데이터베이스 상태로 유지하는 것을 의미한다.
고립성(Isolation)은 트랜잭션을 수행 시 다른 트랜잭션의 연산 작업이 끼어들지 못하도록 보장하는 것을 의미한다.
지속성(Durability)은 성공적으로 수행된 트랜잭션은 영원히 반영되어야 함을 의미한다.
⇒ 하지만 완벽히 지킬수 없음. 동시성이 매우 떨어지기 때문!
READ UNCOMMITTED - 커밋되지 않는 읽기
트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는중에 (커밋 전) 트랜잭션 B가 read하면 A가 변경한 데이터를 읽어온다.
READ COMMITTED - 커밋된 읽기
oracle의 기본 격리수준. 트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는중에 트랜잭션 B가 read하면 트랜잭션 A가 변경하기 전 데이터를 읽어온다(undo영역에서). A가 변경후 커밋하게 되면 변경된 데이터를 읽어온다.
REPEATABLE READ - 반복 가능한 읽기
mysql 기본 격리수준. 항상 일관성 있는 데이터 읽기를 보장. 다른 트랜잭션에서 데이터를 조작해도 영향을 받지 않음. 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정하는 것을 막아주지만, 새로운 로우를 추가하는 것은 제한하지 않는다.
SERIALIZABLE - 직렬화 기능
가장 높은 격리수준. 트랜잭션이 완료될 때 까지 selecte문장이 사용되는 모든 데이터에 공유락이 걸리므로 그 영역에 대한 수정/입력 불가.
선언적 트랜잭션 사용시 주의할점
해당 클래스의 Bean을 다른 클래스의 Bean에서 호출될때만 작동한다. 같은 빈 내에서는 @Transactional을 명시해도 작동하지 않는다.
Lock으로 이해하는 Transaction의 Isolation Level