READ COMMITTED & REPEATABLE READ

Giao dịch và Xử lý lỗi trong SQL Server

Miriam Antona

Software Engineer

READ COMMITTED

  • Mức cô lập mặc định
  • Không đọc dữ liệu do giao dịch khác sửa nhưng chưa commit hoặc rollback
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
Giao dịch và Xử lý lỗi trong SQL Server

READ COMMITTED - so sánh mức cô lập

Đọc bẩn Đọc không lặp lại Đọc bóng ma
READ UNCOMMITTED
READ COMMITTED không
Giao dịch và Xử lý lỗi trong SQL Server

READ COMMITTED - ngăn đọc bẩn

Số dư ban đầu tài khoản 5 = $35.000

Giao dịch 1

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

Giao dịch 2

...

...

...

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

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

READ COMMITTED - ngăn đọc bẩn

Số dư ban đầu tài khoản 5 = $35.000

Giao dịch 1

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

COMMIT TRAN;

Giao dịch 2

...

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 30000,00        |
Giao dịch và Xử lý lỗi trong SQL Server

READ COMMITTED - chọn mà không chờ

Giao dịch 1

BEGIN TRAN
  SELECT current_balance
  FROM accounts WHERE account_id = 5;

Giao dịch 2

...

...

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT current_balance
FROM accounts WHERE account_id = 5;
| current_balance |
|-----------------|
| 35000,00        |
Giao dịch và Xử lý lỗi trong SQL Server

READ COMMITTED - tóm tắt

Ưu:

  • Ngăn đọc bẩn

Nhược:

  • Cho phép đọc không lặp lại và bóng ma
  • Có thể bị chặn bởi giao dịch khác

Khi dùng:

  • Cần chỉ đọc dữ liệu đã commit; chấp nhận đọc không lặp lại và bóng ma
Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  • Không đọc dữ liệu chưa commit từ giao dịch khác
  • Khi đã đọc dữ liệu, giao dịch khác không được sửa dữ liệu đó cho đến khi giao dịch REPEATABLE READ kết thúc
Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ - so sánh mức cô lập

Đọc bẩn Đọc không lặp lại Đọc bóng ma
READ UNCOMMITTED
READ COMMITTED không
REPEATABLE READ không không
Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ - ngăn đọc không lặp lại

Giao dịch 1

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

Giao dịch 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ - ngăn đọc không lặp lại

Giao dịch 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

Giao dịch 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;

Phải chờ!

Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ - ngăn đọc không lặp lại

Giao dịch 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

Giao dịch 2

...

...

UPDATE accounts
SET current_balance = 30000
WHERE account_id = 5;
(1 hàng bị ảnh hưởng)
Giao dịch và Xử lý lỗi trong SQL Server

REPEATABLE READ - tóm tắt

Ưu:

  • Ngăn giao dịch khác sửa dữ liệu bạn đang đọc; ngăn đọc không lặp lại
  • Ngăn đọc bẩn

Nhược:

  • Cho phép đọc bóng ma
  • Bạn có thể bị chặn bởi giao dịch REPEATABLE READ.

Khi dùng:

  • Chỉ muốn đọc dữ liệu đã commit và không muốn giao dịch khác sửa dữ liệu bạn đang đọc; chấp nhận đọc bóng ma
Giao dịch và Xử lý lỗi trong SQL Server

Ayo berlatih!

Giao dịch và Xử lý lỗi trong SQL Server

Preparing Video For Download...