READ COMMITTED & REPEATABLE READ

SQL Server에서의 트랜잭션과 오류 처리

Miriam Antona

Software Engineer

READ COMMITTED

  • 기본 격리 수준
  • 커밋/롤백되지 않은 다른 트랜잭션의 수정 데이터를 읽지 않음
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SQL Server에서의 트랜잭션과 오류 처리

READ COMMITTED - 격리 수준 비교

더티 리드 비반복 읽기 팬텀 리드
READ UNCOMMITTED yes yes yes
READ COMMITTED no yes yes
SQL Server에서의 트랜잭션과 오류 처리

READ COMMITTED - 더티 리드 방지

계정 5의 기존 잔액 = $35,000

Transaction1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

Transaction2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;

대기해야 함!

SQL Server에서의 트랜잭션과 오류 처리

READ COMMITTED - 더티 리드 방지

계정 5의 기존 잔액 = $35,000

Transaction1

BEGIN TRAN
  UPDATE accounts
  SET current_balance = 30000
  WHERE account_id = 5;

COMMIT TRAN;

Transaction2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
SQL Server에서의 트랜잭션과 오류 처리

READ COMMITTED - 대기 없이 조회

Transaction1

BEGIN TRAN
  SELECT current_balance
  FROM accounts WHERE account_id = 5;

Transaction2

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
SQL Server에서의 트랜잭션과 오류 처리

READ COMMITTED - 요약

장점:

  • 더티 리드 방지

단점:

  • 비반복 읽기, 팬텀 리드 허용
  • 다른 트랜잭션에 의해 블로킹될 수 있음

사용 시점:

  • 커밋된 데이터만 읽고 싶을 때. 비반복·팬텀 리드는 허용
SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  • 다른 트랜잭션의 미커밋 데이터는 읽지 않음
  • 한 번 읽은 데이터는 이 트랜잭션이 끝날 때까지 다른 트랜잭션이 수정 불가
SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ - 격리 수준 비교

더티 리드 비반복 읽기 팬텀 리드
READ UNCOMMITTED yes yes yes
READ COMMITTED no yes yes
REPEATABLE READ no no yes
SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ - 비반복 읽기 방지

Transaction1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |

Transaction2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

대기해야 함!

SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ - 비반복 읽기 방지

Transaction1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
COMMIT TRAN

Transaction2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

대기해야 함!

SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ - 비반복 읽기 방지

Transaction1

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRAN
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
    SELECT current_balance FROM accounts
    WHERE account_id = 5;
COMMIT TRAN

Transaction2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 rows affected)
SQL Server에서의 트랜잭션과 오류 처리

REPEATABLE READ - 요약

장점:

  • 읽는 데이터를 다른 트랜잭션이 수정하지 못하게 함, 비반복 읽기 방지
  • 더티 리드 방지

단점:

  • 팬텀 리드 허용
  • REPEATABLE READ 트랜잭션에 의해 블로킹될 수 있음

사용 시점:

  • 커밋된 데이터만 읽고, 읽는 데이터를 다른 트랜잭션이 수정 못 하게 하고 싶을 때. 팬텀 리드는 감수
SQL Server에서의 트랜잭션과 오류 처리

연습해 봅시다!

SQL Server에서의 트랜잭션과 오류 처리

Preparing Video For Download...