Transaction trong SQL là một nhóm các câu lệnh SQL. Nếu một transaction được thực hiện thành công, 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. Nếu một transaction bị lỗi và được rollback, thì tất cả các sửa đổi dữ liệu sẽ bị xóa (dữ liệu được khôi phục về trạng thái trước khi thực hiện transaction).
Đặc điểm của Transaction
Transaction có bốn đặc điểm tiêu chuẩn sau:
- Bảo toàn - đả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ũ.
- 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.
- Độc lập - cho phép các transaction hoạt động độc lập và minh bạch với nhau.
- Bền bỉ - đảm bảo rằng kết quả của một transaction được commit vẫn tồn tại trong trường hợp lỗi hệ thống.
Nội dung chính
Xử lý transaction
Các lệnh sau đây được sử dụng để xử lý transaction.
- COMMIT - để lưu các thay đổi.
- ROLLBACK - để khôi phục lại các thay đổi.
- SAVEPOINT - tạo ra các điểm trong transaction để ROLLBACK.
- SET TRANSACTION - thiết lập các thuộc tính cho 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 DML như - INSERT, UPDATE và DELETE.
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 được commit trong cơ sở dữ liệu.
1. Lệnh COMMIT
Lệnh COMMIT được sử dụng để lưu các thay đổi gọi bởi một transaction với cơ sở dữ liệu.
Lệnh COMMIT lưu tất cả các transaction vào cơ sở dữ liệu kể từ khi lệnh COMMIT hoặc ROLLBACK cuối cùng.
Cú pháp của lệnh COMMIT như sau.
COMMIT;
Ví dụ
Giả sử bảng CUSTOMERS có các bản ghi sau đây:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Sau đây là một ví dụ có thể xóa các bản ghi từ bảng có age = 25 và sau đó COMMIT thay đổi trong cơ sở dữ liệu.
DELETE FROM CUSTOMERS WHERE AGE = 25; COMMIT;
Vì vậy, hai hàng từ bảng sẽ bị xóa và câu lệnh SELECT sẽ cho kết quả sau.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
2. Lệnh ROLLBACK
Lệnh ROLLBACK được sử dụng để hoàn tác các transaction chưa được lưu vào cơ sở dữ liệu. Lệnh này chỉ có thể được sử dụng để hoàn tác các transaction kể từ khi lệnh COMMIT hoặc ROLLBACK cuối cùng được phát hành.
Cú pháp lệnh ROLLBACK như sau:
ROLLBACK;
Ví dụ
Giả sử bảng CUSTOMERS có các bản ghi sau đây:
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Sau đây là một ví dụ, có thể xóa các bản ghi từ bảng có age = 25 và sau đó XÓA các thay đổi trong cơ sở dữ liệu.
DELETE FROM CUSTOMERS WHERE AGE = 25; ROLLBACK;
Vì vậy, hoạt động xóa sẽ không ảnh hưởng đến bảng và câu lệnh SELECT sẽ cho kết quả sau.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
3. Lệnh SAVEPOINT
SAVEPOINT là một điểm trong một transaction khi bạn có thể cuộn transaction trở lại một điểm nhất định mà không quay trở lại toàn bộ transaction.
Cú pháp của lệnh SAVEPOINT như thể hiện dưới đây.
SAVEPOINT SAVEPOINT_NAME;
Lệnh này chỉ phục vụ trong việc tạo ra SAVEPOINT trong số tất cả các câu lệnh transaction. Lệnh ROLLBACK được sử dụng để hoàn tác một nhóm các transaction.
Cú pháp để cuộn lại một SAVEPOINT như thể hiện dưới đây.
ROLLBACK TO SAVEPOINT_NAME;
Sau đây là ví dụ bạn định xóa ba bản ghi khác nhau từ bảng CUSTOMERS. Bạn muốn tạo một SAVEPOINT trước mỗi lần xoá, để bạn có thể XÓA trở lại SAVEPOINT bất kỳ lúc nào để trả lại dữ liệu thích hợp cho trạng thái ban đầu.
Ví dụ
Giả sử bảng CUSTOMERS có các bản ghi sau.
+----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 1 | Ha Anh | 32 | Da Nang | 2000.00 | | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+
Khối mã sau đây có chứa hàng loạt các hoạt động.
SQL> SAVEPOINT SP1; Savepoint created. SQL> DELETE FROM CUSTOMERS WHERE ID=1; 1 row deleted. SQL> SAVEPOINT SP2; Savepoint created. SQL> DELETE FROM CUSTOMERS WHERE ID=2; 1 row deleted. SQL> SAVEPOINT SP3; Savepoint created. SQL> DELETE FROM CUSTOMERS WHERE ID=3; 1 row deleted.
Bây giờ, ba lần xóa đã xảy ra, giả sử rằng bạn đã thay đổi quyết định và quyết định khôi phục lại SAVEPOINT mà bạn đã định nghĩa là SP2. Bởi vì SP2 được tạo ra sau khi xóa đầu tiên, hai lần xóa cuối cùng được khôi phục lại:
ROLLBACK TO SP2; Rollback complete.
Lưu ý rằng chỉ có lần xoá đầu tiên xảy ra kể từ khi bạn khôi phục lại SP2.
SELECT * FROM CUSTOMERS; +----+----------+-----+-----------+----------+ | ID | NAME | AGE | ADDRESS | SALARY | +----+----------+-----+-----------+----------+ | 2 | Van Ha | 25 | Ha Noi | 1500.00 | | 3 | Vu Bang | 23 | Vinh | 2000.00 | | 4 | Thu Minh | 25 | Ha Noi | 6500.00 | | 5 | Hai An | 27 | Ha Noi | 8500.00 | | 6 | Hoang | 22 | Ha Noi | 4500.00 | | 7 | Binh | 24 | Ha Noi | 10000.00 | +----+----------+-----+-----------+----------+ 6 rows selected.
Lệnh SAVEPOINT RELEASE
Lệnh SAVEPOINT RELEASE được sử dụng để loại bỏ một SAVEPOINT mà bạn đã tạo ra.
Cú pháp của lệnh SAVEPOINT RELEASE như sau.
RELEASE SAVEPOINT SAVEPOINT_NAME;
Khi SAVEPOINT bị xóa, bạn không thể sử dụng lệnh ROLLBACK để hoàn tác các transaction được thực hiện kể từ lần SAVEPOINT cuối cùng.
4. Lệnh SET TRANSACTION
Lệnh SET TRANSACTION có thể được sử dụng để bắt đầu một transaction cơ sở dữ liệu. Lệnh này được sử dụng để chỉ định các đặc tính cho transaction sau. Ví dụ, bạn có thể chỉ định một transaction chỉ được đọc hoặc đọc viết.
Cú pháp cho lệnh SET TRANSACTION như sau.
SET TRANSACTION [ READ WRITE | READ ONLY ];