Transaction trong SQL



Transaction trong SQL là một đơn vị công việc được thực hiện bởi một Database. Transaction là đơn vị hoặc dãy công việc được thực hiện theo một thứ tự logic và hợp lý, có thể được thao tác bởi người dùng hoặc bởi một Database program.

Một transaction là một sự lan truyền của một hoặc nhiều thay đổi tới Database. Ví dụ, nếu bạn đang tạo một bản ghi hoặc cập nhật một bản ghi hoặc xóa một bản ghi từ một bảng, thì bạn đang thực hiện transaction trên bảng đó. Nó là quan trọng để điều khiển các transaction để bảo đảm toàn vẹn dữ liệu và để xử lý các Database Error.

Thực tế, bạn sẽ tập hợp nhiều truy vấn SQL vào trong một nhóm và sẽ thực thi tất cả truy vấn này cùng với nhau như là một phần của một transaction.

Property của Transaction trong SQL

Transaction có 4 property chuẩn, thường được tham chiếu bởi tên lược danh là ACID:

  • Atomicity: bảo đảm rằng tất cả hoạt động bên trong đơn vị công việc được hoàn thành một cách thành công; nếu không, transaction bị ngừng ở điểm thất bại, và các hoạt động trước được trao trả về trạng thái trước đó.

  • Consistency: bảo đảm rằng Database thay đổi một cách chính xác trạng thái theo một transaction đã được ký thác thành công.

  • Isolation: cho các transaction khả năng hoạt động một cách độc lập và không liên quan đến nhau.

  • Durability: bảo đảm rằng kết quả hoặc tác động của một transaction, mà đã được ký thác, vẫn còn tồn tại trong trường hợp hệ thống thất bại.

Điều khiển transaction trong SQL

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 INSERT, UPDATE và DELETE. Chúng không thể được sử dụng trong khi tạo và xóa bảng, bởi vì những hoạt động này được ký thác tự động trong Database.

Lệnh COMMIT trong SQL

Lệnh COMMIT là lệnh điều khiển transaction được sử dụng để lưu các thay đổi đã được triệu hồi bởi một transaction tới Database.

Lệnh COMMIT lưu giữ tất cả transaction trong Database từ lệnh COMMIT hoặc ROLLBACK cuối cùng.

Cú pháp cơ bản của lệnh COMMIT là như sau:

COMMIT;

Ví dụ

Bảng SINHVIEN có các bản ghi sau:

+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Ví dụ sau sẽ xóa các bản ghi từ bảng mà có tuoi = 19 và sau đó COMMIT các thay đổi vào trong Database.

SQL> DELETE FROM SINHVIEN
     WHERE TUOI = 19;
SQL> COMMIT;

Trong kết quả thu được, hai hàng của bảng sẽ bị xóa và lệnh SELECT sẽ cho kết quả sau:

+----+----------+-----+-----------+----------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+----------+-----+-----------+----------+

Lệnh ROLLBACK trong SQL

Lệnh ROLLBACK là lệnh điều khiển transaction được sử dụng để trao trả transaction về trạng thái trước khi có các thay đổi mà chưa được lưu tới Database.

Lệnh ROLLBACK chỉ có thể được sử dụng để undo các transaction từ lệnh COMMIT hoặc ROLLBACK cuối cùng được thông báo.

Cú pháp cơ bản của lệnh ROLLBACK như sau:

ROLLBACK;

Ví dụ

Bảng SINHVIEN có các bản ghi sau:

+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Bây giờ sử dụng lệnh ROLLBACK với lệnh xóa tuoi = 19, mà chưa được commit như sau:

SQL> DELETE FROM SINHVIEN
     WHERE TUOI = 19;
SQL> ROLLBACK;

Trong kết quả thu được, hoạt động Delete này không ảnh hưởng tới bảng và lệnh SELECT sẽ cho kết quả:

+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Lệnh SAVEPOINT trong SQL

Một SAVEPOINT là một điểm (point) trong một transaction khi bạn có thể lùi transaction về một điểm cụ thể mà không cần lùi transaction về trạng thái đầu trước khi có thay đổi đó.

Cú pháp cơ bản của lệnh SAVEPOINT như sau:

SAVEPOINT TEN_CUA_SAVEPOINT;

Lệnh này chỉ phục vụ trong việc tạo một SAVEPOINT trong các lệnh điều khiển transaction. Lệnh ROLLBACK được sử dụng để undo một nhóm các transaction.

Cú pháp để lùi về một SAVEPOINT như sau:

ROLLBACK TO TEN_CUA_SAVEPOINT;

Trong ví dụ sau, bạn muốn xóa 3 bản ghi khác nhau từ bảng SINHVIEN. Bạn muốn tạo một SAVEPOINT trước mỗi lệnh DELETE, để mà bạn có thể ROLLBACK về bất kỳ SAVEPOINT nào tại bất cứ lúc nào để trả dữ liệu thích hợp về trạng thái ban đầu của nó.

Ví dụ

Bảng SINHVIEN có các bản ghi sau:

+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  1 | Hoang   |  21 | CNTT      | 4000000       |
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+

Dưới đây là một dãy các hoạt động:

SQL> SAVEPOINT SP1;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Savepoint created.
SQL> DELETE FROM SINHVIEN WHERE ID=3;
1 row deleted.

Ở trên, có 3 hoạt động xóa diễn ra. Sau một lúc, bạn thay đổi suy nghĩ và quyết định ROLLBACK về SAVEPOINT mà bạn đã xác định là SP2. Bởi vì SP2 được tạo sau hoạt động xóa đầu tiên, do đó hai hoạt động xóa cuối cùng được undo.

SQL> ROLLBACK TO SP2;
Rollback complete.

Chú ý rằng, chỉ có hoạt động xóa đầu tiên diễn ra khi bạn rollback về SP2.

SQL> SELECT * FROM SINHVIEN;
+----+---------+-----+-----------+--------+
| ID |  TEN    | TUOI|  KHOAHOC  | HOCPHI |
+----+---------+-----+-----------+---------+
|  2 | Viet    |  19 | DTVT      | 3000000     |
|  3 | Thanh   |  18 | KTDN      |  4000000      |
|  4 | Nhan    |  19 | CK        |   4500000   |
|  5 | Huong   |  20 | TCNH      |   5000000     |
+----+---------+-----+-----------+---------+
4 rows selected.

Lệnh RELEASE SAVEPOINT trong SQL

Lệnh RELEASE SAVEPOINT được sử dụng để xóa một SAVEPOINT mà bạn đã tạo.

Cú pháp cơ bản của lệnh RELEASE SAVEPOINT trong SQL như sau:

RELEASE SAVEPOINT TEN_CUA_SAVEPOINT;

Một khi một SAVEPOINT đã bị xóa, bạn không thể sử dụng lệnh ROLLBACK để lùi transaction về SAVEPOINT đó nữa.

Lệnh SET TRANSACTION trong SQL

Lệnh SET TRANSACTION có thể được sử dụng để khởi tạo một Database Transaction. Lệnh này được sử dụng để xác định đặc trưng cho transaction đó.

Ví dụ, bạn có thể xác định một transaction là read only hoặc read write.

Cú pháp cơ bản của lệnh SET TRANSACTION trong SQL như sau:

SET TRANSACTION [ READ WRITE | READ ONLY ];