트랜잭션 격리 수준

DB 2023. 8. 24. 11:19

- @참고(oracle jdbc transaction): https://docs.oracle.com/javase/tutorial/jdbc/basics/transactions.html

- @참고(트랜잭션 격리 수준): https://creampuffy.tistory.com/175

- @참고(트랜잭션 격리 수준과 lock): https://suhwan.dev/2019/06/09/transaction-isolation-level-and-lock/

- @참고(mysql phantom row 처): https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html

 

- The interface Connection includes five values the represent the transaction isolation levels you can use in JDBC:

 

- READ UNCOMMITED

Dirty Read 가 발생한다.

    - Dirty Read: 트랜잭션이 2개 이상 열릴 때, 나중에 열린 트랜잭션에서 앞선 트랜잭션의 rollback 될 값일 수도 있는 commit 되지 않은 값을 읽을 수 있다. 

 

- READ COMMITED 

Non Repeatable Read 가 발생한다.

    - Non-Repeatable Read: 트랜잭션이 2개 이상 열릴 때, 나중에 열린 트랜잭션에서 commit 을 한 경우 먼저 열린 트랜잭션에서 같은 값을 반복해서 조회했을 때 값이 변한다.

오라클의 기본 트랜잭션 격리 수준이다.

 

- REPEATABLE READ

InnoDB 가 아닐 경우, Phantom Read 가 발생한다.

    - Non-Repeatable Read 가 발생하지 않는 이유: 각 트랜잭션언 트랜잭션 ID로 관리된다.

    선 트랜잭션 A가 트랜잭션을 열면, A commit 전에 후 트랜잭션 B가 열렸을 때 A의 새로운 값은 버퍼풀에, 기존 값은 언두 로그에 기록한다.

    A 가 commit 되면 버퍼풀의 새로운 값을 디스크에 기록되고,

    언두 로그의 기존 값은 열려있는 다른 트랜잭션인 B가 참조하며, B에서도 commit 이 일어날 시에 삭제 된다.

    - Phantom Read: Non-Repeatable Read 가 한 트랜잭션 내에서 하나의 레코드 값에 대하여 반복 조회시 다른 값을 조회할 수 있는 경우라면, Phantom Read는 한 트랜잭션 내에서 조회 시 결과 레코드 수가 달라질 수 있음을 말한다.

InnoDB의 기본 트랜잭션 격리 수준이다. InnoDB에서는 next-key 잠금 알고리즘을 이용해서 Phantom Read 를 방지한다.

 

- SERIALIZABLE

InnoDB의 경우 Gap lock 이 걸려서 조건에 해당하는 새로운 row 가 추가되는 것을 방지한다. 

SERIALIZABLE isolation level은 데이터를 안전하게 보호할 수 있지만 굉장히 쉽게 deadlock 에 걸릴 수 있다. 따라서 신중히 계산하고 사용해야한다.

 

 

블로그 이미지

uchacha

개발자 일지

,