Transaction 은 데이터베이스의 상태를 변화시키기 위해 수행되는 작업 단위입니다.
데이터베이스 트랜잭션이 안전하게 수행된다는 것을 보장하기 위한 성질을 가리키는 약어입니다.
트랜잭션의 격리 수준(Isolation Level)이란 여러 트랜잭션이 동시에 처리될 때,
특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것입니다. 트랜잭션의 격리 수준은 격리수준이 높은 순서대로
SERIALIZABLE, REPEATABLE READ, READ COMMITTED, READ UNCOMMITED 가 존재합니다.
READ UNCOMMITED
: 커밋되지 않은 데이터를 다른 트랜잭션에서 접근 할 수 있습니다.
하지만 DirtyRead가 가능하기 때문에 잘못된 데이터를 읽을 수 있습니다.
DirtyRead - DB에 커밋하지 않은 존재하지 않은 데이터를 읽는 현상
READ COMMITTED
: 커밋한 데이터만 읽을 수 있습니다.
Non-Repeatble Read가 발생할 수 있습니다.
트랜잭션에서 조회한 데이터가 트랜잭션이 끝나기 전에 다른 트랜잭션에 의해 변경되면 다시 읽었을 때 새로운 값이 읽히며 데이터 불일치하는 현상을 말합니다.
하나의 트랜잭션 내에서 똑같은 SELECT 쿼리를 실행했을 때 항상 같은 결과를 가져와야 한다는 REPEATABLE READ 정합성 정의에 어긋납니다.
REPEATABLE READ
: 하나의 트랜잭션은 하나의 스냅샷만 사용할 수 있습니다.
MySQL에서 사용하고 있는 트랜잭션 격리 수준입니다.
Phantom Read라는 다른 트랜잭션에서 수행한 작업에 의해 안보이던 데이터가 보일 수 있습니다.
repeatable_read 격리 수준은 조회한 데이터에 대해서만 Shared Lock 이 걸리기 때문에 다른 트랜잭션이 새로운 데이터를 추가할 수 있습니다.
SERIALIZABLE
: 순차적으로 트랜잭션을 실행하여 읽기 작업에도 잠금을 겁니다.
가장 안전하지만 성능이 저하됩니다.
Spring 이 제공하는 @Transactional 은 여러 트랜잭션을 묶어서 하나의 트랜잭션 경계를 만들 수 있습니다.
하지만 기존의 트랜잭션이 진행 중일 때 추가적인 트랜잭션을 사용해야 할 경우가 생길 수 있습니다
추가 트랜잭션을 어떻게 진행할지 결정하는 것이 전파 속성 입니다.
REQUIRED
:REQUIRES_NEW
:NAMDATORY
:SUPPORTS
:NESTED
:NEVER
: