READ COMMITTED & REPEATABLE READ

Transactions and Error Handling in SQL Server

Miriam Antona

Software Engineer

READ COMMITTED

  • ระดับ isolation เริ่มต้น
  • ไม่สามารถอ่านข้อมูลที่ถูกแก้ไขโดย transaction อื่นที่ยังไม่ได้ commit หรือ rollback
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Transactions and Error Handling in SQL Server

READ COMMITTED - เปรียบเทียบระดับ isolation

Dirty reads Non-repeatable reads Phantom reads
READ UNCOMMITTED yes yes yes
READ COMMITTED no yes yes
Transactions and Error Handling in SQL Server

READ COMMITTED - การป้องกัน dirty reads

ยอดเงินเดิมในบัญชี 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;

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

READ COMMITTED - การป้องกัน dirty reads

ยอดเงินเดิมในบัญชี 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        |
Transactions and Error Handling in SQL Server

READ COMMITTED - การ SELECT โดยไม่ต้องรอ

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        |
Transactions and Error Handling in SQL Server

READ COMMITTED - สรุป

ข้อดี:

  • ป้องกัน dirty reads

ข้อเสีย:

  • ยังเกิด non-repeatable reads และ phantom reads ได้
  • อาจถูก transaction อื่น block ได้

ควรใช้เมื่อใด:

  • ต้องการอ่านเฉพาะข้อมูลที่ commit แล้ว แต่ไม่กังวลเรื่อง non-repeatable reads หรือ phantom reads
Transactions and Error Handling in SQL Server

REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  • ไม่สามารถอ่านข้อมูลที่ยังไม่ commit จาก transaction อื่น
  • หากอ่านข้อมูลใดไปแล้ว transaction อื่นจะไม่สามารถแก้ไขข้อมูลนั้นได้จนกว่า REPEATABLE READ transaction จะเสร็จสิ้น
Transactions and Error Handling in SQL Server

REPEATABLE READ - เปรียบเทียบระดับ isolation

Dirty reads Non-repeatable reads Phantom reads
READ UNCOMMITTED yes yes yes
READ COMMITTED no yes yes
REPEATABLE READ no no yes
Transactions and Error Handling in SQL Server

REPEATABLE READ - การป้องกัน non-repeatable reads

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;

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

REPEATABLE READ - การป้องกัน non-repeatable reads

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;

ต้องรอก่อน!

Transactions and Error Handling in SQL Server

REPEATABLE READ - การป้องกัน non-repeatable reads

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)
Transactions and Error Handling in SQL Server

REPEATABLE READ - สรุป

ข้อดี:

  • ป้องกันไม่ให้ transaction อื่นแก้ไขข้อมูลที่กำลังอ่านอยู่ และป้องกัน non-repeatable reads
  • ป้องกัน dirty reads

ข้อเสีย:

  • ยังเกิด phantom reads ได้
  • อาจถูก transaction ที่ใช้ REPEATABLE READ block ได้

ควรใช้เมื่อใด:

  • ต้องการอ่านเฉพาะข้อมูลที่ commit แล้ว และไม่ต้องการให้ transaction อื่นแก้ไขข้อมูลที่กำลังอ่าน โดยไม่กังวลเรื่อง phantom reads
Transactions and Error Handling in SQL Server

มาฝึกกันเถอะ!

Transactions and Error Handling in SQL Server

Preparing Video For Download...