SQL # [Transaction Isolation Level 4가지]

Danny·2023년 10월 16일
0

백엔드

목록 보기
3/10

트랜잭션

  • 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위를 뜻한다.

작업의 단위(질의어)

  • SELECT
  • INSERT
  • DELETE
  • UPDATE

정의
트랜잭션 격리 수준은 동시에 여러 트랜잭션이 처리될 때 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것입니다.

그렇다면, 트랜잭션 격리 수준 개념은 왜 등장 했을까?

트랜잭션의 ACID(원자성, 일관성, 고립성, 지속성)특성을 모두 다 지키려고 노력하다보면 동시성에 대한 성능이 저하됩니다.
따라서, 트랜잭션 격리 수준을 나누어 ACID 특성을 너무 타이트하게 지키지 않게끔 만들어줍니다.
많은 데이터베이스 어플리케이션들은 높은 트랜잭션 격리 수준을 사용하지 않으려고 합니다. 왜냐하면,

  • 동시성 처리에 대한 성능이 떨어집니다.
  • Deadlock이 발생할 확률이 높아집니다.
  • Lock으로 인한 시스템 오버헤드가 증가합니다.
  • DBMS는 MVCC(Multiversion Concurrency Control)을 구현하거나 * Lock을 사용(lock-based concurrency control)해야 합니다.

Level 1

Read Uncommitted
Read Uncommitted는 commit이나 rollback에 상관없이 트랜잭션의 데이터 변경 내용을 다른 트랜잭션이 읽는 것을 허용하는 트랜잭션 격리 수준입니다. 따라서, Dirty Read가 발생합니다.

Dirty Read 는 트랜잭션이 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있게 되는 현상을 말합니다.

Level 2

Read Committed
Read Committed는 commit이 완료된 트랜잭션의 변경사항만 다른 트랜잭션에서 조회가 가능한 트랜잭션 격리 수준입니다.
Dirty Read가 발생하지 않으며, Undo영역의 백업된 레코드에서 값을 가져옵니다.
많은 RDB 서비스에서 가장 많이 사용하는 트랜잭션 격리 수준입니다.
하지만, Non-Repeatable Read가 발생합니다.

Non-Repeatable Read 한 트랜잭션 안에서 똑같은 SELECT 쿼리(read)를 실행했을 때 항상 같은 결과를 가져오지 않는 현상이다.
예방 방법
Non-Repeatable Read를 예방하는 방법으로는 두 가지 방법이 존재합니다.

  • Transaction A가 commit이나 rollback이 될 때까지 Transaction B의 실행을 지연하는 것입니다.
  • Multiversion Concurrency Control(MVCC)을 사용합니다.


Level 3

Repeatable Read
트랜잭션 범위 내에서 조회한 내용이 항상 동일함을 보장하는 트랜잭션 격리 수준입니다. 또한, MySQL의 InnoDB에서 기본으로 사용하는 트랜잭션 격리 수준입니다. 트랜잭션은 고유한 번호를 가지며 Undo 영역에 백업된 모든 레코드에는 변경을 발생시킨 트랜잭션의 번호가 포함되어 있습니다. 하나의 트랜잭션 안에서 일어나는 모든 SELECT 쿼리는 자신의 트랜잭션 번호보다 작은 트랜잭션 번호에서 변경한 사항들만 볼 수 있습니다. 이러한 방식을 MVCC라고 합니다.

MVCC(Multiversion Concurrency Control)는 다중 버젼 동시성 제어의 약자로 DBMS에서 서로 다른 세션이 동일한 데이터에 접근했을 때 각 세션마다 스냅샷 이미지를 보장해주는 매커니즘입니다. RDBMS에서 동시성을 높이기 위해 등장한 기술입니다. MVCC의 가장 큰 목적은 Lock을 사용하지 않는 일관된 읽기를 제공하기 위함이며, InnoDB에서는 Undo log를 이용하여 이 기능을 제공하고 있습니다.

Level 4

Serializable Read
Serializable Read는 모든 작업을 하나의 트랜잭션에서 처리하는 것과 같이 동작하는 가장 높은 트랜잭션 격리 수준입니다. 한 트랜잭션에서 읽고 쓰는 레코드를 다른 트랜잭션에서는 절대 접근할 수 없습니다. 따라서, Phantom Read 문제가 발생하지 않습니다. 하지만, Deadlock에 걸릴 가능성이 존재하고 동시성 처리 성능이 저하되기 때문에 신중하게 사용해야 합니다.


용어 정리

Phantom Read

다른 트랜잭션에서 수행한 변경 작업에 의해 레코드가 보였다가 안 보였다가 하는 현상입니다.
https://itpenote.tistory.com/616
동시성 제어( Concurrency Control )

동시에 실행되는 여러 개의 트랜잭션이 작업을 성공적으로 마칠 수 있도록 트랜잭션의 실행 순서를 제어하는 기법이다.

동시성 제어 목적

  • 트랜잭션의 직렬성 보장
  • 공유도 최대, 응답 시간 최소, 시스템 활동의 최대 보장
  • 데이터의 무결성 및 일관성 보장

Undo

  • 실행 취소 로그 레코드의 집합으로 트랜잭션 실행 후 Rollback 시 Undo * Log를 참조해 이전 데이터로 복구할 수 있도록 로깅 해놓은 영역이다.


-https://syujisu.tistory.com/entry/SQLLOCK%EC%9D%B4%EB%9E%80
-https://mommoo.tistory.com/62
-https://kimsg.tistory.com/258
-https://brownbears.tistory.com/181
-https://velog.io/@chiyongs/Transaction-Isolation-Level--%EA%B7%B8%EA%B2%8C-%EB%AD%94%EB%8D%B0
-https://jokerkwu.tistory.com/125
-https://www.digitalocean.com/community/tutorials/sql--commit-sql-rollback

0개의 댓글