반응형
05-14 20:55
Today
Total
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[Database] Transaction과 격리 수준 본문

Database

[Database] Transaction과 격리 수준

조용한고라니 2021. 10. 17. 01:44
반응형

Transaction

트랜잭션이란 여러 쿼리를 하나의 업무단위로 묶는 것이다.

 

START TRANSACTION;

SELECT * FROM users WHERE id = '1';

UPDATE users SET NAME = 'first' WHERE id = '1';

SELECT * FROM users WHERE id = '1';

COMMIT;

Transaction의 성질

트랜잭션의 성질은 흔히 ACID라고 말한다.

  • Atomicity(원자성) : 트랜잭션의 결과는 100% 모두 반영되거나 반영되지 않아야 한다.
  • Consistency(일관성) : 트랜잭션의 결과는 일관성 있어야하고, 데이터베이스는 트랜잭션의 결과를 반영한 후에도 일관적이어야 한다. 여기서 일관적이란 데이터의 타입 등이 바뀌지 않는 것이다.
  • Isolation(독립성) : 둘 이상의 트랜잭션이 수행될 때 각 트랜잭션은 서로의 연산에 간섭할 수 없다. 즉 트랜잭션은 독립적으로 수행되어야 한다.
  • Durablity(지속성) : 반영된 트랜잭션의 결과를 데이터베이스는 영구히 지속해야한다.

 

하지만 이러한 트랜잭션의 성질을 100% 고수하는 것은 데이터베이스의 성능 저하를 야기할 수 있다. 트랜잭션 처리가 느려지기 때문이다.

 

따라서 적절한 트랜잭션의 격리 수준을 제어하며 이러한 문제를 조절할 수 있다.

Transaction Isolation Level

트랜잭션의 격리 수준은 DBMS마다 다르지만, 보통 4단계가 있다. (포스트그리는 READ UNCOMMITTED가 없는 것으로 안다.)

 

우리가 흔히 사용하는 MySQL은 REPEATABLE READ를 default 로 사용하고, Oracle은 READ COMMITTED를 사용한다

  • READ UNCOMMITTED
  • READ COMMITTED
  • REPEATABLE READ
  • SERIALIZABLE

READ UNCOMMITTED

트랜잭션이 커밋 전에 변경한 데이터를 다른 트랜잭션에서 읽을 수 있는 수준

왠만해선 사용하지 않도록 권장된다. 이 수준에서는 어떠한 LOCK도 걸리지 않으며, 발생할 수 있는 부정합은 Dirty Read, Non-Repeatable Read, Phantom Read가 있다.

READ COMMITTED

트랜잭션이 커밋 완료한 데이터만 다른 트랜잭션에서 조회할 수 있다.

Oracle에서 기본적으로 사용되는 격리 수준이며, SELECT 문이 실행되는 동안 SELECT문에 쓰인 모든 데이터에 Shared Lock이 걸린다.

(Shared Lock은 read연산은 가능하며, write 연산은 불가하다. 다른 트랜잭션이 동시에 같은 데이터에 대해 Shared Lock을 걸 수 있다.)

 

발생할 수 있는 부정합은 Non-Repeatable Read와 Phantom Read가 있다.

REPEATABLE READ

한 트랜잭션에서 2회 이상 동일한 조회를 했을 때 반드시 동일한 데이터를 읽는 수준,
현재 트랜잭션보다 낮은 트랜잭션에서 커밋된 데이터만 읽을 수 있다.

MySQL에서 기본적으로 사용되는 격리 수준으로, Transaction이 완료될 때 까지 SELECT에 사용된 모든 데이터에 Shared Lock이 걸린다. 

다른 트랜잭션은 해당 데이터들에 대해 수정이 불가능하다.

 

발생할 수 있는 부정합은 Phantom Read가 있다.

SERIALIZABLE

트랜잭션이 끝날 때까지 사용 중인 데이터에 대해 접근할 수 없다.

가장 단순하지만 가장 엄격한 격리 수준이다. 이름처럼 '직렬' 즉, 트랜잭션들을 한 줄을 세워 순차적으로 처리해나가는 것이다. 따라서 동시성은 매우 떨어지지만 데이터의 무결성은 높아진다. 발생할 수 있는 부정합은 없다.

이상 현상

  • Dirty Read
  • Non-Repeatable Read
  • Phantom Read

Dirty Read

READ UNCOMMITTED 격리 수준에서 나타날 수 있는 현상이다. 이는 트랜잭션의 커밋 이전의 변경된 데이터를 보고있을 때, 그 트랜잭션이 롤백된다면 현재 보고있는 데이터는 잘못된 데이터가 되는 경우이다.

Non-Repeatable Read

READ COMMITTED 이하 격리 수준에서 발생할 수 있는 현상이다. 이는 한 트랜잭션에서 동일한 SELECT 쿼리 2회를 실행했을 때 첫 번째 조회 쿼리와 두 번째 조회 쿼리의 결과가 다른 경우이다. 다른 트랜잭션에서 동시에 해당 데이터에 대해 수정하면 이와같은 현상이 나타난다.

Phantom Read

REPEATABLE READ 이하 격리 수준에서 발생할 수 있는 현상이다. 이는 Non-Repeatable Read의 한 종류이며, 마찬가지로 한 트랜잭션에서 동일한 SELECT 쿼리 2회를 실행했을 때 첫 번째 조회쿼리에서 발견되지 않은 데이터가 두 번째 조회 쿼리에서 나타나는 경우이다. 다른 트랜잭션이 해당 데이터에 동시에 데이터 삽입을 했을 경우 발생한다.

 

  Dirty Read Non-Repeatable Read Phantom Read
READ UNCOMMITTED O O O
READ COMMITTED X O O
REPEATABLE READ X X O
SERIALIZABLE X X X
반응형

'Database' 카테고리의 다른 글

[Database] Database와 SQL  (0) 2021.04.16
Comments