- 원자성(Atomicity)
: 한 트랜잭션의 결과는 성공 혹은 실패뿐- 일관성(Consistency)
: 일관성있는 데이터베이스 상태를 유지- 격리성(Isolation)
: 트랜잭션 간 독립적이어야한다- 지속성(Durability)
: 트랜잭션을 마치면 저장되어야한다.
Springd은 트랜잭션 추상화를 제공한다. 이를 통해 Jdbc나 Hibernate에 종속되지 않고 트랜잭션 처리가 가능해진다.
스프링은 관점 지향 프로그래밍을 통해 트랜잭션을 위한 코드를 별도로 분리하였고 이를 어노테이션화하여 @Transactional을 통해 쉽게 적용할 수 있다.
A가 진행중인 작업이며 B가 새로운 작업일 경우
- Required
: 보통 디폴트이며 A가 트랜잭션일 경우 A+B(같은 트랜잭션에 묶임)
A, B는 같은 트랜잭션이며 운명을 함께한다.- Required_New
: B는 항상 새로운 트랜잭션을 만듬.
A, B는 별개의 트랜잭션이고 서로 영향을 안준다.- Mandatory
: 트랜잭션이 필요하다. 기존 트랜잭션이 있을경우 참여(Required)하지만, 없을경우 예외가 반환된다.- Supportes
: 트랜잭션이 있으면 묶이고, 없으면 트랜잭션 없이 작업함- Not_Supported
: 트랜잭을 사용하지 않으며, 있을경우 A의 트랜잭션을 잠시 멈추고 작업을 진행, B의 작업이 끝난 후 멈추었던 트랜잭션을 다시 진행시킨다.- Never
: 트랜잭션을 사용하지 않는다. 만일 A가 트랜잭션 동작중일 경우 예외를 반환.- Nested
: 진행중인 트랜잭션이 있으면 중첩 트랜잭션을 시작한다.
(중첩된 트랜잭션 -> 부모(A)/자식(B) 관계로 보면 부모 트랜잭션의 커밋 롤백은 자식에게 영향을 주지만 그 반대는 성립되지 않음.
- Dirty Read
A가 값을 before -> new 변경 / not commit 상태일 때
B가 조회할 경우 new가 읽히는 것
발생되는 문제 -> not commit 이므로 rollback하면 값은 before이 되지만 B가 읽은 값은 new
- Non-Repeatabe Read
A가 조회한 값 = before / B가 before -> new 값 변경 / A가 한 트랜잭션 안에서 다시 같은 값을 조회했을 때 나오는 값 = new
한 트랜잭션에서 같은 쿼리문을 조회했는데 결과가 다르다.
- Phantom Read
A가 레코드 조회했을때 값 =[1, 2, 3] / 이후 B가 값에 [4, 5, 6]을 추가한다면 같은 쿼리를 조회했을 때 또 값이 달라짐.
Default
: 사용하는 DB의 기본 전략을 따름
Read_Uncommitted(level 0)
: 트랜잭셔 처리중인 데이터에 대한 읽기 허용
-> Dirty Read 발생
Read_Committed(level 1)
: 커밋 된 데이터만 읽기 허용(데이터가 트랜잭션 중에는 접근 불가)
-> Dirty Read 방지
Repeatable_Read(leve 2)
: 트랜잭션 완료 전까지 데이터 갱신, 변경 불가능
-> Non-Repeatable_Read 방지
Serializable(leve 3)
: 트랜잭션 완료 전까지 새로운 레코드 삽입 방지
-> Phantom Read 방지
https://goddaehee.tistory.com/167
http://wiki.gurubee.net/pages/viewpage.action?pageId=21200923