NỘI DUNG BÀI VIẾT
TRANSACTION trong SQL là tiến trình thực hiện một nhóm các câu lệnh SQL. Các câu lệnh này được thực thi một cách tuần tự và độc lập. Một Transaction được thực hiện thành công khi tất cả câu lệnh đều thành công, khi đó tất cả các thay đổi dữ liệu được thực hiện trong Transaction được lưu vào cơ sở dữ liệu. Tuy nhiên, nếu chỉ một trong số đó thất bại thì toàn bộ tiến trình sẽ thất bại, đồng nghĩa với việc dữ liệu phải rollback về trạng thái ban đầu (dữ liệu được khôi phục về trạng thái trước khi thực hiện Transaction).
Thuộc tính của Transaction
1. Atomicity – Tính bảo toàn: nguyên tắc “all or nothing”, đảm bảo rằng tất cả các câu lệnh trong nhóm lệnh được thực thi thành công. Nếu không, Transaction bị hủy bỏ tại thời điểm thất bại và tất cả các thao tác trước đó được khôi phục về trạng thái cũ đồng nghĩa với việc không có gì thay đổi về mặt dữ liệu.
2. Consistency – Tính nhất quán: đảm bảo rằng cơ sở dữ liệu thay đổi chính xác các trạng thái khi một transaction được thực thi thành công.
3. Isolation – Tính độc lập: cho phép các Transaction hoạt động độc lập và minh bạch với nhau.
4. Durability – Tính bền vững: đảm bảo rằng kết quả của một transaction được xác định, không có chuyện dữ liệu của Transaction sau khi thực thi có thể chuyển lại trạng thái dữ liệu lúc trước khi thực hiện.
Xử lý Transaction
Trong SQL, có các lệnh sau được sử dụng để điều khiển Transaction:
- COMMIT: để lưu các thay đổi.
- ROLLBACK: để quay trở lại trạng thái trước khi có thay đổi.
- SAVEPOINT: tạo các điểm (point) bên trong các nhóm Transaction để ROLLBACK, tức là để quay trở lại điểm trạng thái đó.
- SET TRANSACTION: đặt một tên cho một Transaction.
Các lệnh điều khiển Transaction chỉ được sử dụng với các lệnh thao tác dữ liệu như INSERT, UPDATE và DELETE. Tuy nhiên chúng không thể được sử dụng trong lệnh CREATE TABLE hoặc DROP TABLE vì các hoạt động này được tự động xác định trong cơ sở dữ liệu.
Lệnh kiểm soát transaction
1. BEGIN TRANSACTION
Câu lệnh BEGIN TRANSACTION đánh dấu điểm bắt đầu của một transaction. Cú pháp:
BEGIN { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
;
Code language: JavaScript (javascript)
Trong đó:
- Transaction_name : chỉ ra tên được gán cho transaction. Cần thực hiện theo những quy tắc đặt tên và giới hạn tên dài không quá 32 ký tự.
- @tran_name_variable : chỉ ra tên của một biến do người dùng định nghĩa. Biến có thể được khai báo là kiểu dữ liệu char , varchar , nchar , hoặc nvarchar . Nếu có nhiều hơn 32 ký tự được truyền vào biến, khi đó chỉ có 32 ký tự được sử dụng và các ký tự còn lại sẽ bị cắt bớt.
- WITH MARK [ ‘description’] : chỉ ra transaction được đánh dấu trong log, cùng mô tả cho định nghĩa đánh dấu này.
Ví dụ về khai báo transaction sử dụng biến tên định nghĩa một transaction sẽ xóa một hồ sơ ứng viên có JobCandidateID là 13
USE AdventureWorks;
GO
DECLARE @TranName VARCHAR(30);
SELECT @TranName = 'FirstTransaction';
BEGIN TRANSACTION @TranName;
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 13;
Code language: PHP (php)
2. COMMIT TRANSACTION
Câu lệnh COMMIT TRANSACTION này đánh dấu sự kết thúc của một transaction thành công. Nếu @@TRANCOUNT = 1, khi đó, COMMIT TRANSACTION thực hiện tất cả thay đổi dữ liệu được thực hiện trên cơ sở dữ liệu và trở thành một phần vĩnh viễn của cơ sở dữ liệu. Hơn nữa, nó giải phóng các nguồn lực do transaction nắm giữ và giảm xuống @@TRANCOUNT = 0 Mỗi lệnh commit transaction sẽ giảm @@TRANCOUNT xuống 1 đơn vị: @@TRANCOUNT = @@TRANCOUNT – 1 Cú pháp:
COMMIT { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable] ];
Trong đó:
- Transaction_name : chỉ ra tên được gán cho transaction đã khai báo ở BEGIN TRANSACTION trước đó.
- @tran_name_variable : chỉ ra tên của một biến do người dùng định nghĩa. Ví dụ cho thấy cách thực hiện một giao tác trong bảng HumanResources.JobCandidate của cơ sở dữ liệu AdventureWorks (Có sẵn trong CSDL khi cài đặt SQL Server) định nghĩa một transaction sẽ xóa một hồ sơ ứng viên có JobCandidateID là 11:
BEGIN TRANSACTION;
GO
DELETE FROM HumanResources.JobCandidate WHERE JobCandidateID = 11;
GO
COMMIT TRANSACTION;
GO
3. COMMIT WORK
Câu lệnh COMMIT WORK đánh dấu sự kết thúc của transaction. Sau đây là cú pháp:
COMMIT [ WORK ] [ ; ]
Code language: CSS (css)
COMMIT TRANSACTION và COMMIT WORK là giống hệt nhau, ngoại trừ một thực tế là COMMIT TRANSACTION chấp nhận tên giao tác do người dùng định nghĩa, còn COMMIT WORK thì không.
4. ROLLBACK TRANSACTION
Rollback transaction được sử dụng để xóa tất cả các sửa đổi dữ liệu được thực hiện từ khi bắt đầu giao dịch hoặc tới điểm đã lưu. Nó còn giải phóng các nguồn lực do giao tác nắm giữ. Cú pháp:
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
Trong đó:
- savepoint_name : chỉ ra savepoint_name từ câu lệnh SAVE TRANSACTION . Sử dụng savepoint_name chỉ khi một lần quay lui có điều kiện ảnh hưởng đến một phần của transaction.
- @savepoint_variable : chỉ ra tên của một biến điểm đã lưu. Biến có thể được khai báo là kiểu dữ liệu char , varchar , nchar , hoặc nvarchar.
Ví dụ:
- Giả định rằng một cơ sở dữ liệu có tên Sterling đã được tạo ra. Bảng có tên là ValueTable được tạo ra trong cơ sở dữ liệu này:
USE Sterling;
GO
CREATE TABLE ValueTable ([value] char)
GO
Code language: PHP (php)
- Tạo ra một transaction chèn 2 bản ghi vào ValueTable. Sau đó thực hiện rollback và một lần nữa chèn một bản ghi vào ValueTable. Khi câu lệnh SELECT được sử dụng để truy vấn bảng, bạn sẽ thấy rằng chỉ có một bản ghi duy nhất có giá trị C được hiển thị. Điều này là do các phép tính INSERT trước đó đã được quay lui hoặc hủy bỏ.
BEGIN TRANSACTION
INSERT INTO ValueTable VALUES('A');
INSERT INTO ValueTable VALUES('B');
GO
ROLLBACK TRANSACTION
INSERT INTO ValueTable VALUES('C');
SELECT [value] FROM ValueTable;
Code language: JavaScript (javascript)
5. ROLLBACK WORK
Câu lệnh này rollback một transaction do người dùng quy định tới điểm bắt đầu transaction. Sau đây là cú pháp:
ROLLBACK [ WORK ] [ ; ]
Code language: CSS (css)
Từ khóa WORK là tùy chọn và ít được sử dụng.
6. SAVE TRANSACTION
Câu lệnh SAVE TRANSACTION thiết lập một điểm đã lưu trong một transaction. Sau đây là cú pháp cho câu lệnh SAVE TRANSACTION.
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
Ví dụ:
CREATE PROCEDURE SaveTranExample
@InputCandidateID INT
AS
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
SAVE TRANSACTION ProcedureSave;
ELSE
BEGIN TRANSACTION;
DELETE HumanResources.JobCandidate
WHERE JobCandidateID = @InputCandidateID;
IF @TranCounter = 0
COMMIT TRANSACTION;
IF @TranCounter = 1
ROLLBACK TRANSACTION ProcedureSave;
GO
Code language: PHP (php)
Thực hiện lưu transaction có tên ProcedureSave trong thủ tục SaveTranExample, và điểm lưu trữ này sẽ được sử dụng để rollback lại nếu tồn tại một transaction được bắt đầu trước khi thủ tục được thực hiện.
@@TRANCOUNT
Function @@TRANCOUNT trả về một số câu lệnh BEGIN TRANSACTION xảy ra trong kết nối hiện tại. Cứ mỗi begin transaction sẽ làm tăng @@TRANCOUNT lên 1 đơn vị, hay nói cách khác nó trả về số lượng transaction hiện có. Ví dụ minh họa cho hoạt động của @@TRANCOUNTVí dụ: hiển thị số lần câu lệnh BEGIN TRAN và COMMIT thực hiện trong kết nối hiện tại.
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
BEGIN TRAN
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
COMMIT
PRINT @@TRANCOUNT
Code language: PHP (php)
Kết quả thu được:
Tổng kết
Trên đây là một số kiến thức của Transaction trong SQL, mong rằng sẽ giúp ích cho bạn. Chúc bạn học tốt.
Xem thêm: