13. [JPA] 트랜잭션 격리 수준 (Transaction Isolation Level)

프로그래밍|2017. 9. 12. 12:28

격리성은 동시에 실행되는 트랜잭션이 서로에게 영향을 미치지 않도록 격리한다.

예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다는 것이다.


격리 수준에는 다음과 같이 4가지가 있다.

아래로 갈수록 격리 수준이 높아짐

1
2
3
4
READ UNCOMMITTED (커밋되지 않는 읽기)
READ COMMITTED (커밋된 읽기)
REPEATABLE READ (반복 가능한 읽기)
SERIALIZABLE (직렬화 기능)
cs



[READ UNCOMMITTED - 커밋되지 않는 읽기]

트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는 중에(커밋하지 않은 상태) 트랜잭션 B가 read하면 트랜잭션 A가 변경한 데이터를 읽어온다. 이것이 커밋되지 않는 읽기이다.

커밋되지 않는 읽기는 dirty read라는 문제가 있다. 이는 트랜잭션 A가 특정 컬럼 데이터를 변경하고 rollback 했을 때 발생한다.



[READ COMMITTED - 커밋된 읽기]

트랜잭션 A가 특정 컬럼 데이터를 변경하고 있는 중에(커밋하지 않은 상태) 트랜잭션 B가 read하면 트랜잭션 A가 변경하기 전 데이터를 읽어온다. 만약 트랜잭션 A가 데이터 변경 후 커밋하게 되면 트랜잭션 B는 변경된 데이터를 읽어온다.

이것이 커밋된 읽기이다.



[REPEATABLE READ - 반복 가능한 읽기]

항상 일관성 있는 데이터 읽기를 보장하는 레벨

REPEATABLE READ 레벨은 다른 트랜잭션에서 데이터를 조작하여도 영향을 받지 않는다.



[SERIALIZABLE - 직렬화 기능]

가장 높은 격리 수준

트랜잭션이 완료될 때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 사용자는 그 영역에 해당되는 데이터에 수정 및 입력이 불가능하다.



[참고]


각 DB별 default isolation

1
2
3
4
MSSQL : READ COMMITTED
MYSQL : REPEATABLE READ
ORACLE : READ COMMITTED
H2 : READ COMMITTED
cs


댓글()