지금까지 만든 DAO 에 트랜잭션을 적용해보면서 스프링이 어떻게 성격이 비슷한 여러 종류의 기술들을 추상화하고, 일관된 방법으로 사용할 수 있도록 지원하는지 살펴보자
Default
: 사용하는 데이터 액세스 기술 또는 DB 드라이버의 디폴트 설정을 따른다, 보통 드라이버의 격리수준은 DB의 격리수준을 따르는게 일반적이며, 대부분의 DB는 Read_commited가 기본 격리수준이다Read_UnCommited
: 가장 낮은 격리수준이다 하나의 트랜잭션이 커밋되기 전에 그 변화가 다른 트랜잭션에 그대로 노출되는 문제가 있다, 하지만 가장 빠르다 ,데이터의 일관성이 떨어지더라도 성능 극대화를 위해서 사용된다Read_Commited
: 실제로 가장 많이 사용하는 격리수준이다, 스프링에서 Default로 설정해두면 DB 격리수준을 따라서 Read_Commited가 적용되는게 일반적이며, 명시적이 설정이 필요없다, Read_UnCommited와 달리 다른 트랜잭션이 커밋하지 않은 정보를 읽을 수 없다, 대신 하나의 트랜잭션이 읽는 로우를 다른 트랜잭션이 수정할 수 있다, 때문에 처음 트랜잭션이 같은 로우를 다시 읽을 경우 다른 내용이 발견될 수 있다Repetable_Read
: 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정하는걸 막아준다, 새로운 로우를 추가하는 것은 제한하지 않는다, 때문에 Select로 조건에 맞는 로우를 가져오는 경우 트랜잭션이 끝나기 전에 추가된 로우가 있을 수 있다Serializable
: 가장 강력한 트랜잭션 격리수준이다, 이름 그대로 트랜잭션을 순차적으로 진행시켜준다, 때문에 여러 트랜잭션이 동시에 같은 테이블의 정보를 접근하지 못한다, 가장 안전한 격리수준이지만, 가장 성능이 떨어지기 때문에 극단적으로 안전한 작업에만 사용하는걸 권한다.