You are on page 1of 5

30/9/2018 Transaction trong SQL | 79 bài học SQL hay nhất

Transaction trong SQL


vietjack.com/sql/transaction_trong_sql.jsp

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


https://vietjack.com/sql/transaction_trong_sql.jsp 1/5
30/9/2018 Transaction trong SQL | 79 bài học SQL hay nhất

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:
https://vietjack.com/sql/transaction_trong_sql.jsp 2/5
30/9/2018 Transaction trong SQL | 79 bài học SQL hay nhất

+----+---------+-----+-----------+--------+
| 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:

https://vietjack.com/sql/transaction_trong_sql.jsp 3/5
30/9/2018 Transaction trong SQL | 79 bài học SQL hay nhất

+----+---------+-----+-----------+--------+
| 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


https://vietjack.com/sql/transaction_trong_sql.jsp 4/5
30/9/2018 Transaction trong SQL | 79 bài học SQL hay nhất

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 ];

https://vietjack.com/sql/transaction_trong_sql.jsp 5/5

You might also like