Tags:

Transaction trong SQL và 4 tính chất đặc trưng của Transaction

Transaction là một chủ đề được đề cập đến rất nhiều trong các ứng dụng doanh nghiệp, để đảm bảo tính toàn vẹn của dữ liệu ngay cả trong các hệ thống lớn phát sinh một lớn các thay đổi lên database và đồng thời. Transaction là một tập hợp các hoạt động đọc/ghi xuống database hoặc là chúng đều thực thi thành công hết hoặc không có hoạt động nào được thực thi xuống database.

transaction-workflow1

Từ hình trên có thể thấy transaction đầu tiên thành công khi tất cả các hoạt động đọc/ghi đều thành công, trong khi transaction thứ 2 bị rollback vì hoạt đông thứ 2 không thành công.

Vốn dĩ một transaction được đặc trưng bởi 4 yếu tố (thường được gọi là ACID):

  1. Atomicity
  2. Consistency
  3. Isolation
  4. Durability

Trong một cơ sở dữ liệu, mọi câu lệnh SQL được phải thực thi trong phạm vi của một transaction. Nếu không có định nghĩa phạm vi của transaction, database sẽ ngầm định rằng mỗi câu SQL sẽ được bao bên ngoài một transaction. 

Atomicity

Atomicity quy định rằng tất cả các hoạt động của transaction hoặc là thực thi thành công hết hoặc là không có bất cứ hành động nào được thực khi có bất kỳ một hoạt động thực thi không thành công.

Vì vậy một transaction chỉ có 2 trạng thái:

  • Abort: Tất cả các thay đổi của transaction sẽ không được đồng bộ xuống database.
  • Commit: Tất cả các thay đổi của transaction được đồng bộ xuống database.

Ví dụ chúng ta có một giai dịch của ngân hàng chuyển 100 đồng từ tài khoảng X sang tài khoản Y

Nếu tại bước transaction thực thi thành công tại bước T1 nhưng khi đến bước T2 thì hệ thống bị lỗi. Lúc này nếu những thay đổi này được đồng bộ xuống database thì vô tình tài khoản X bị mất 100 đồng mà tài khoản Y lại không nhận được đồng nào. Đây là ví dụ kinh điển mà Atomicity có thể đảm bảo các hệ thống sẽ không xảy ra sai xót như trên.

Consistency

Consistency nghĩa là tất cả các ràng buộc toàn vẹn dữ liệu(constraints, key, data types, Trigger, Check) phải được thực thi thành công cho mọi transaction phát sinh xuống database, nhầm đảm bảo tính đúng đắn của dữ liệu.

Isolation

Isolation đảm bảo các transaction xảy ra xen kẽ sẽ không làm ảnh hưởng đến tính nhất quán của dữ liệu. Các thay đổi dữ liệu bên trong mỗi transaction sẽ được cô lập, các transaction khác sẽ không thể nhìn thấy cho đến khi nó được đồng bộ xuống database. 

Cho X = 50, Y = 50.

Giả sử transaction T thực thi trước cho đến bước Read(Y) thì transaction T” bắt đầu thực thi, lúc này sẽ diễn ra tình trạng 2 transaction chạy xen kẽ nhau. Khi T” đọc giá trị của X thì có được giá trị tương ứng với trong T là (X * 100 = 500), nhưng Y là 50 so với T khi thực thi xong thì Y là 0.

Durability

Durability đảm bảo một transaction thực thi thành công thì tất cả những thay đổi trong transaction phải được đồng bộ xuống database kể cả khi hệ thống xảy ra lỗi hoặc bị mất điệ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 COMMIT trong SQL

Transaction kết thúc với một trong hai câu lệnh COMMIT hoặc ROLLBACK với mục đích khác nhau. COMMIT ý chỉ rằng transaction đã thành công và mọi thay đổi đã được đồng bộ với database. Trong khi ROLLBACK chỉ ra rằng transaction đã gặp lỗi trong quá trình thực thi, tất cả các thay đổi dữ liệu trong transaction sẽ không được đồng bộ xuống database.

Khi một Transaction hoàn chỉnh được hoàn thành thì lệnh COMMIT phải được gọi ra. Đây là lệnh điều khiển Transaction được sử dụng để lưu các thay đổi gọi bởi một Transaction tới cơ sở dữ liệu.

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

COMMIT;

Ví dụ: Giả sử bảng CUSTOMERS có các bản ghi như sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

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

SQL> DELETE FROM CUSTOMERS
   WHERE AGE = 25;
SQL> 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 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Lệnh ROLLBACK trong SQL

Lệnh ROLLBACK được dùng để hoàn tác lại các thay đổi của một transaction thực hiện thay đổi dữ liệu trên database. Lệnh này thường được dùng khi có một lỗi xảy ra trong quá trình thực thi transaction

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

ROLLBACK;

Ví dụ: Giả sử bảng CUSTOMERS có các bản ghi như sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

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

QL> DELETE FROM CUSTOMERS
   WHERE AGE = 25;
SQL> ROLLBACK;

Trong kết quả thu được, hoạt động DELETE này không ảnh hưởng tới bảng vì đã ROLLBACK các thay đổi trong cơ sở dữ liệu, lệnh SELECT sẽ cho kết quả:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Lệnh SAVEPOINT trong SQL

SAVEPOINT giúp chúng ta lưu lại trạng thái của dữ liệu và các hành động của transaction tại một thời điểm cụ

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

SAVEPOINT SAVEPOINT_NAME;

Lệnh này chỉ tạo ra SAVEPOINT trong các câu lệnh Transaction. Sau đó ROLLBACK cần được sử dụng để hoàn tác trở lại một SAVEPOINT như sau:

ROLLBACK TO SAVEPOINT_NAME;

Ví dụ: Bạn muốn xóa ba bản ghi khác nhau từ bảng CUSTOMERS và muốn tạo SAVEPOINT trước mỗi lần xoá để có thể ROLLBACK trở lại SAVEPOINT bất kỳ lúc nào giúp trả lại dữ liệu thích hợp cho trạng thái ban đầu.

Giả sử bảng CUSTOMERS có các bản ghi như sau:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

Dưới đây là một chuỗi các câu lệnh:

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.

Ở trên, có 3 hoạt động xóa dữ liệu diễn ra. Giả sử 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 khôi phục lại.

SQL> ROLLBACK TO SP2;
Rollback complete.

Vì vậy chỉ có hoạt động xóa đầu tiên diễn ra sau khi bạn ROLLBACK về SP2.

Lệnh RELEASE SAVEPOINT trong SQL

Lệnh SAVEPOINT RELEASE được sử dụng để loại bỏ một SAVEPOINT đã được tạo ra trước đó.

Cú pháp của SAVEPOINT RELEASE như sau:

RELEASE SAVEPOINT SAVEPOINT_NAME;

Lệnh SET TRANSACTION trong SQL

SET TRANSACTION có thể được sử dụng để khởi tạo một Database Transaction. Lệnh này được sử dụng để chỉ định các đặc tính cho Transaction đó. Ví dụ, bạn có thể chỉ định một Transaction chỉ được đọc (read only) hoặc đọc viết (read write).

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

SET TRANSACTION [ READ WRITE | READ ONLY ];

Nguồn tham khảo

https://www.geeksforgeeks.org/sql-transactions/

https://www.tutorialspoint.com/sql/sql-transactions.htm

4 2 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x