SQL Transaction (P2)

sql transaction (p2)

1. Cách Thức Hoạt Động của SQL Transaction

a. Khởi tạo và Lưu trữ Giao dịch

Khi một giao dịch bắt đầu với lệnh BEGIN TRANSACTION, các thao tác SQL sau đó sẽ không ngay lập tức được áp dụng vào cơ sở dữ liệu chính. Thay vào đó, các thay đổi này được lưu trữ tạm thời trong Transaction Log (nhật ký giao dịch).

Transaction Log là một thành phần quan trọng trong SQL Server, chứa thông tin chi tiết về tất cả các thay đổi được thực hiện bởi các giao dịch. Nó ghi lại mọi thao tác chỉnh sửa, chèn, xóa dữ liệu và đảm bảo rằng có thể hoàn nguyên hoặc cam kết các thay đổi khi cần thiết.

b. Commit và Rollback

  • COMMIT TRANSACTION: Khi giao dịch hoàn tất và không có lỗi, lệnh COMMIT sẽ được sử dụng. Điều này làm cho các thay đổi tạm thời trong Transaction Log được áp dụng chính thức vào cơ sở dữ liệu. Lúc này, các thay đổi trở thành vĩnh viễn và không thể bị hoàn nguyên.

  • ROLLBACK TRANSACTION: Nếu có lỗi xảy ra hoặc giao dịch cần phải được hủy bỏ, lệnh ROLLBACK sẽ được sử dụng. Các thay đổi tạm thời trong Transaction Log sẽ bị loại bỏ, và cơ sở dữ liệu sẽ trở về trạng thái trước khi giao dịch bắt đầu.

2. Xử Lý Đồng Thời trong SQL Transaction

a. Isolation Levels (Mức độ Cô lập)

Để quản lý việc nhiều giao dịch được thực hiện đồng thời, SQL Server sử dụng các mức độ cô lập khác nhau để đảm bảo tính nhất quán và tránh xung đột. Các mức độ cô lập chính bao gồm:

  • READ UNCOMMITTED: Cho phép các giao dịch đọc dữ liệu chưa cam kết của các giao dịch khác. Dễ xảy ra "dirty read" (đọc dữ liệu bẩn).

  • READ COMMITTED: Chỉ cho phép đọc dữ liệu đã cam kết. Tránh được "dirty read" nhưng có thể xảy ra "non-repeatable read" (đọc không lặp lại).

  • REPEATABLE READ: Ngăn chặn "dirty read" và "non-repeatable read". Dữ liệu đọc trong giao dịch sẽ không thay đổi trong suốt thời gian giao dịch.

  • SERIALIZABLE: Cấp độ cao nhất, ngăn chặn tất cả các loại xung đột. Đảm bảo rằng các giao dịch được thực hiện tuần tự.

Ví dụ:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;


BEGIN TRANSACTION;

-- Thực hiện các thao tác SQL

COMMIT;


b. Locking (Khóa)

SQL Server sử dụng cơ chế locking để quản lý truy cập đồng thời vào dữ liệu. Các loại khóa bao gồm:

  • Shared Lock (Khóa chia sẻ): Được sử dụng cho các thao tác đọc. Cho phép nhiều giao dịch đọc cùng lúc nhưng ngăn chặn ghi.

  • Exclusive Lock (Khóa độc quyền): Được sử dụng cho các thao tác ghi. Ngăn chặn các giao dịch khác đọc hoặc ghi dữ liệu bị khóa.

  • Update Lock (Khóa cập nhật): Được sử dụng khi một giao dịch có ý định cập nhật một hàng. Nó ngăn chặn deadlock bằng cách ngăn chặn việc nâng cấp từ khóa chia sẻ lên khóa độc quyền.

Ví dụ về cơ chế locking:

BEGIN TRANSACTION;

SELECT * FROM Accounts WITH (XLOCK); -- Khóa độc quyền trên bảng Accounts

UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;

COMMIT;


c. Deadlock (Tình trạng khóa chết)

Deadlock xảy ra khi hai hoặc nhiều giao dịch giữ các khóa mà các giao dịch khác cần, tạo thành một vòng tròn không thể tiến hành. SQL Server phát hiện và giải quyết deadlock bằng cách hủy một trong các giao dịch và cho phép giao dịch khác tiếp tục.

Ví dụ:

-- Transaction 1

BEGIN TRANSACTION;

UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;

WAITFOR DELAY '00:00:05'; -- Giả sử quá trình xử lý kéo dài

UPDATE Orders SET Status = 'Processed' WHERE OrderID = 1;

COMMIT;


--Transaction 2

BEGIN TRANSACTION;

UPDATE Orders SET Status = 'Processed' WHERE OrderID = 1;

WAITFOR DELAY '00:00:05'; -- Giả sử quá trình xử lý kéo dài

UPDATE Accounts SET Balance = Balance - 100 WHERE AccountID = 1;

COMMIT;


Trong ví dụ trên,Transaction 1 và Transaction 2 sẽ tạo ra deadlock và SQL Server sẽ phải hủy một trong số chúng để tiếp tục hoạt động.