READ COMMITTED と REPEATABLE READ

SQL Server におけるトランザクションとエラー処理

Miriam Antona

Software Engineer

READ COMMITTED

  • 既定の分離レベル
  • 他トランザクションで変更された未コミット/未ロールバックのデータは読めない
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SQL Server におけるトランザクションとエラー処理

READ COMMITTED - 分離レベル比較

ダーティリード 非再現読取り ファントムリード
READ UNCOMMITTED あり あり あり
READ COMMITTED なし あり あり
SQL Server におけるトランザクションとエラー処理

READ COMMITTED - ダーティリードの防止

口座5の元残高 = $35,000

トランザクション1

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

トランザクション2

...

...

...

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

「待機が必要」

SQL Server におけるトランザクションとエラー処理

READ COMMITTED - ダーティリードの防止

口座5の元残高 = $35,000

トランザクション1

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

COMMIT TRAN;

トランザクション2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
SQL Server におけるトランザクションとエラー処理

READ COMMITTED - 待たずに選択

トランザクション1

BEGIN TRAN
  SELECT current_balance
  FROM accounts WHERE account_id = 5;

トランザクション2

...

...

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 あり あり あり
READ COMMITTED なし あり あり
REPEATABLE READ なし なし あり
SQL Server におけるトランザクションとエラー処理

REPEATABLE READ - 非再現読取りの防止

トランザクション1

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

トランザクション2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

「待機が必要」

SQL Server におけるトランザクションとエラー処理

REPEATABLE READ - 非再現読取りの防止

トランザクション1

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

トランザクション2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

「待機が必要」

SQL Server におけるトランザクションとエラー処理

REPEATABLE READ - 非再現読取りの防止

トランザクション1

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

トランザクション2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 rows affected)
SQL Server におけるトランザクションとエラー処理

REPEATABLE READ - まとめ

長所:

  • 読み取り中のデータの更新を他トランザクションから防止、非再現読取りを防止
  • ダーティリードを防止

短所:

  • ファントムリードは許容
  • REPEATABLE READ によりブロックされる場合あり

適用場面:

  • コミット済みのみ読み、読んだデータを他に更新させたくない。ファントムは許容
SQL Server におけるトランザクションとエラー処理

Passons à la pratique !

SQL Server におけるトランザクションとエラー処理

Preparing Video For Download...