Transaction : 데이터베이스의 데이터를 조작하는 작업의 단위이다.

transaction은 ACID원칙을 보장해야 한다. 

  • Atomicity (원자성) : 트랜잭션의 작업이 부분적으로 실행되거나 중단되지 않는 것을 보장한다. All or Nothing의 개념
  • Consistency (일관성) : 트랜잭션이 성공적으로 완료되면 일관적인 DB상태를 유지해야 한다.
  • Isolation (독립성) : 트랜잭션 수행시 다른 트랜잭션의 작업이 끼어들지 못하도록 보장하는것을 말한다.
  • Durability (영구성) : 성공적으로 수행된 트랜잭션은 영원히 반영되는것을 말한다.

 

Commit : 하나의 트랜잭션이 성공적으로 끝났고, DB가 일관성있는 상태일 때 이를 알려주기 위해 사용하는 연산

Rollback : 하나의 트랜잭션 처리가 비정상적으로 종료되어 트랜잭션 원자성이 깨진 경우, 트랜잭션의 시작상태로 롤 백 할 수 있음.

 

하지만 ACID 원칙은 종종 지켜지지 않는다. 원칙을 완벽하게 지키려 하면 동시성이 매우 떨어지기 때문이다. 

그렇기 때문에 DB 엔진은 ACID 원칙을 희생하여 동시성을 얻을 수 있는 방법을 제공한다. 바로 transaction의 Isolation level이다. Isolation 원칙을 덜 지키는 level을 사용할수록 문제가 발생할 가능성은 커지지만 동시성은 얻을 수 있다. 

동시성을 제공함으로써 생기는 격리성 문제

1. Dirty Read

- 데이터 캐시에는 변경이 되었지만, 디스크에는 변경되지 않은 데이터를 Dirty Page라하고, 이를 읽는 작업을 Dirty Read

2. Non-Repeatable Read

- 트랜잭션 내 다른 시점에 읽은 하나의 데이터가 값이 다른 것

3. Phantom Read

- 트랜잭션 수행 중 없던 행이 추가되어 새로운 데이터를 읽게 되거나 존재하던 데이터가 사라지는 것, 트랜잭션 내 동일한 조건으로 읽은 데이터의 개수가 달라지는 것

 

트랜잭션 격리 Level

1. Read Uncommitted

  • 트랜잭션이 완료(Commit)되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용
  • 해당 데이터를 SELECT할 경우 Shared-Lock이 걸리지 않는다.
  • 발생할 수 있는 격리성 문제 : Dirty Read, Non-repeatable Read, Phantom Read

 

2. Read Committed

  • 트랜잭션이 완료된 데이터만 읽는 것을 허용
  • 해당 데이터를 SELECT할 경우 Shared-Lock 이 적용된다.
  • SELECT가 끝날때까지만 Shared-Lock이 적용된다. 
  • 발생할 수 있는 격리성 문제 : Non-repeatable Read, Phantom Read

 

3. Repeatable Read

  • 트랜잭션이 완료되기 전까지 Shared-Lock을 적용하여 다른 트랜잭션에서 해당 데이터를 읽을 수 없다.
  • 따라서 트랜잭션이 완료 되기 전까지 일관된 데이터가 보장된다. (Non-Repeatable Read 예방)
  • Shared-Lock이 해제 되기 전에도 다른 트랜잭션에서 새로운 데이터를 삽입하는 것은 가능하기때문에 Phantom Read는 발생할 수 있다.
  • 발생할 수 있는 격리성 문제 : Phantom Read

 

4. Serializable

  • Shared-Lock이 범위(Range) 단위로 적용되고, 트랜잭션이 완료된 이후에 해제가 된다.
  • 범위 단위의 Lock 덕분에 Phantom Read까지 예방할 수 있다.
  • 발생할 수 있는 격리성 문제 : 없음



출처: https://s1107.tistory.com/45 [개발자]

'데이터베이스' 카테고리의 다른 글

RDB와 NOSQL 차이점 간단 정리  (0) 2021.06.07
Index  (0) 2021.05.18

+ Recent posts