트랜잭션 격리 수준

Choco·2024년 4월 30일
1
post-thumbnail

트랜잭션 격리 수준

여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 여부를 결정하는 것

  • SERIALIZABLE
    같은 데이터에 대해 트랜잭션이 동시에 이루어 질 수 없다.
    select에 대해서도 s-lock을 수행하기에 성능면에서 많이 떨어진다.

  • REPEATABLE READ
    다른 트랜잭션이 읽는 정보를 수정 반영할 수 없다.
    ex)트랜잭션 A가 데이터를 읽는 도중 트랜잭션 B가 수정하고 커밋하여도 트랜잭션 A에선 수정되기 전으로 읽는다.

  • READ COMMITTED
    커밋한 데이터만 읽는다
    ex)트랜잭션 A가 커밋전에 데이터를 수정하면 동시에 실행되고 있는 트랜잭션 B가 수정된 데이터를 읽어온다.
    트랜잭션 B가 두번 읽게 되면 서로 다른 정보를 읽을 수 도 있다.
    -> 수정에 따라 다른 정보면 Non-Repeatable Read 새로운 데이터가 추가되면 Phantom Read

  • READ UNCOMMITED
    커밋되지 않은 데이터를 읽어온다
    ex)트랜잭션 A가 커밋전에 데이터를 수정하면 동시에 실행되고 있는 트랜잭션 B가 수정된 데이터를 읽어온다.
    -> A 롤백시 B가 데이터를 잘못 읽게되는 Drity Read 발생 가능
    -> 동시 작업이 가능하여 성능면에서 제일 우수하지만 안정성은 떨어진다.

Mysql은 REPEATABLE_READ를 기본 격리 수준으로 가진다

주의

트랜잭션 격리 수준과 db lock은 다른 개념이다. 둘다 동시성 문제를 해결하기 위해 존재하는 것은 맞지만 트랜잭션 격리를 위해 db lock을 사용할 수도 있을 뿐,mvcc 같이 lock 없이도 할 수 있다. 또한 db lock은 특정 트랜잭션안 쿼리문에 따라 유동적으로 실행되게 할 수 있다.

Ref

https://mangkyu.tistory.com/299
https://stackoverflow.com/questions/22646226/how-are-locking-mechanisms-pessimistic-optimistic-related-to-database-transact

profile
주니어 백엔드 개발자 입니다:)

0개의 댓글