Transaction trong SQL Server

2771 lượt xem
Các kiểu dữ liệu trong sql mà bạn cần biết

Khi học về SQL chắc chắn các bạn sẽ được tìm hiểu về transaction SQL. Đây là một nhóm câu lệnh trong SQL rất thường xuyên được sử dụng. Vậy cụ thể, cách dùng transaction trong SQL như thế nào? Hãy cùng theo dõi ngay sau đây!

1.Transaction trong SQL

Transaction là một tập hợp các câu lệnh SQL được thực thi theo trình tự và độc lập. Transaction đảm bảo tính nhất quán và toàn vẹn của dữ liệu trong cơ sở dữ liệu. Một Transaction được coi là thành công nếu tất cả các câu lệnh trong đó đều thực hiện thành công.Mọi thay đổi dữ liệu sẽ được lưu vào cơ sở dữ liệu một cách vĩnh viễn thông qua lệnh COMMIT. Tuy nhiên, nếu bất kỳ câu lệnh nào trong giao dịch thất bại, toàn bộ giao dịch sẽ bị hủy bỏ thông qua lệnh ROLLBACK, và các thay đổi dữ liệu sẽ được hoàn tác, đưa cơ sở dữ liệu về trạng thái trước khi giao dịch bắt đầu.

2Các thuộc tính của Transaction

Tính bảo toàn (Atomicity): “All or nothing”, đây là thuộc tính đảm bảo sẽ thực thi thành công toàn bộ câu lệnh trong nhóm lệnh đó. Nếu không, tại thời điểm thất bại transaction sẽ bị hủy bỏ, đồng thời khôi phục lại những thao tác trước đó về trạng thái cũ. Nghĩa là sẽ không xuất hiện bất kỳ thay đổi dữ liệu nào

Tính nhất quán (Consistency): Đảm bảo nếu SQL transaction được thực thi thành công thì các dữ liệu sẽ thay đổi chính xác trạng thái

Tính độc lập (Isolation): Trong SQL server transaction sẽ được hoạt động một cách độc lập với nhau

Tính bền vững (Durability): Đảm bảo rằng kết quả của 1 transaction được xác định và không xuất hiện tình trạng dữ liệu của transaction chuyển lại trạng thái trước đó sau khi thực thi thành công

3. Các lệnh xử lý trong Transaction

Các lệnh sau đây được sử dụng để xử lý các giao dịch (transaction) trong cơ sở dữ liệu, đảm bảo tính nhất quán và toàn vẹn dữ liệu.

  • COMMIT: Lệnh này dùng để lưu các thay đổi đã thực hiện trong giao dịch. Khi lệnh COMMIT được thực thi, tất cả các thay đổi trở nên vĩnh viễn và không thể quay lại.
  • ROLLBACK: Lệnh này được sử dụng để khôi phục lại các thay đổi đã thực hiện, đưa cơ sở dữ liệu trở về trạng thái trước khi bắt đầu giao dịch. Điều này rất hữu ích khi xảy ra lỗi hoặc khi muốn hủy bỏ các thay đổi không mong muốn.
  • SAVEPOINT: Lệnh này tạo ra các điểm lưu trong giao dịch, cho phép quay lại một điểm cụ thể thay vì phải khôi phục toàn bộ giao dịch. Điều này mang lại tính linh hoạt cao trong quản lý các thay đổi.
  • SET TRANSACTION: Lệnh này thiết lập các thuộc tính cho giao dịch như mức độ cô lập (isolation level), ưu tiên (priority), và thời gian chờ (timeout), giúp tối ưu hóa hiệu suất và độ tin cậy của giao dịch.

Các lệnh điều khiển giao dịch 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 các lệnh DDL như CREATE TABLE hoặc DROP TABLE, vì các hoạt động này được tự động commit trong cơ sở dữ liệu, đảm bảo tính toàn vẹn cấu trúc dữ liệu.

3.1  Lệnh COMMIT trong SQL

COMMIT có tác dụng lưu lại những thay đổi được gọi bởi 1 transaction với CSDL tính từ lệnh COMMIT hoặc ROLLBACK cuối cùng.

Cú pháp:

COMMIT;

Ví dụ: Nếu chúng ta có 1 bảng CUSTOMERS như sau:

1

2

3

4

5

6

7

8

9

10

11

 +----+----------+-----+-----------+----------+

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

+----+----------+-----+-----------+----------+

Chúng ta sẽ xóa các bản ghi từ bảng có age giá trị 25 rồi thực hiện lệnh COMMIT:

1

2

3

 DELETE FROM CUSTOMERS

WHERE AGE = 25;

ROLLBACK;

Kết quả sau khi thực hiện câu lệnh SELECT là:

+—-+———-+—–+———–+———-+
| 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.2 Lệnh ROLLBACK trong SQL

Lệnh ROLLBACK transaction SQL có tác dụng hoàn tác các transaction chưa được lưu vào CSDL kể từ khi lệnh COMMIT hoặc ROLLBACK cuối cùng được phát hành.

Cú pháp:

ROLLBACK;

Ví dụ: Trong bảng CUSTOMERS có:

1

2

3

4

5

6

7

8

9

10

11

+—-+———-+—–+———–+———-+

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

+—-+———-+—–+———–+———-+

Chúng ta thực hiện xóa các bản ghi có age giá trị 25 và Xóa các thay đổi trong CSDL:

1

2

3

DELETE FROM CUSTOMERS

WHERE AGE = 25;

ROLLBACK;

Thực hiện xóa không gây ra ảnh hưởng tới bảng. Khi thực hiện tiếp câu lệnh SELECT sẽ cho kết quả như sau:

1

2

3

4

5

6

7

8

9

10

11

+—-+———-+—–+———–+———-+

| 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.3 Lệnh SAVEPOINT trong SQL

SAVEPOINT là 1 điểm cho phép lùi transaction quay lại điểm nhất định mà không cần lùi transaction đó về lại trạng thái đầu trước khi diễn ra sự thay đổi. Lệnh SAVEPOINT chỉ được sử dụng để tạo ra SAVEPOINT trong mọi câu lệnh transaction.

Cú pháp SAVEPOINT:

SAVEPOINT SAVEPOINT_NAME;

Cú pháp cuộn lại một SAVEPOINT:

ROLLBACK TO SAVEPOINT_NAME;

Ví dụ: Tại bảng CUSTOMERS các bạn cần xóa bỏ 3 bản ghi khác nhau và trước mỗi lần xóa thực hiện tạo một SAVEPOINT, cho phép các bạn có thể XÓA trở lại SAVEPOINT bất cứ lúc nào để trả lại dwx liệu ban đầu.

  • Bảng CUSTOMERS:
1

2

3

4

5

6

7

8

9

10

11

+----+----------+-----+-----------+----------+

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

+----+----------+-----+-----------+----------+
  • Các hoạt động:
1

2

3

4

5

6

7

8

9

10

11

12

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.

Như vậy bạn đã thực hiện 3 lần xóa. Ví dụ, giờ bạn muốn khôi phục lại SAVEPOINT được định nghĩa là SP2. Do SP2 đã được tạo ra sau khi thực hiện lần xóa đầu tiên, 2 lần xóa cuối được khôi phục lại như sau:

ROLLBACK TO SP2; 
Rollback complete.

Lưu ý: Kể từ khi khôi phục SP2 chỉ có lần xóa đầu tiên xảy ra.

1

2

3

4

5

6

7

8

9

10

11

12

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.

3.4 Lệnh RELEASE SAVEPOINT trong SQL

Có tác dụng loại bỏ 1 SAVEPOINT đã tạo ra.

Cú pháp:

1
RELEASE SAVEPOINT SAVEPOINT_NAME;

Các bạn sẽ không sử dụng được lệnh ROLLBACK nữa sau khi SAVEPOINT đã bị xóa.

3.5 Lệnh SET TRANSACTION trong SQL

Có tác dụng bắt đầu một transaction trong CSDL, dùng cho mục đích chỉ định đặc tính của transaction SQL sau.

Cú pháp:

SET TRANSACTION [ READ WRITE | READ ONLY ];

Lệnh SET TRANSACTION là cách để khởi đầu một giao dịch (transaction) trong cơ sở dữ liệu, giúp bạn định nghĩa các thuộc tính cụ thể cho giao dịch sắp tới

Ví dụ, thông qua lệnh SET TRANSACTION, bạn có thể chỉ định giao dịch chỉ được phép đọc dữ liệu (read-only) hoặc có thể thực hiện cả đọc và ghi dữ liệu (read-write). Ngoài ra, bạn còn có thể thiết lập các thuộc tính như mức độ cô lập (isolation level), giúp ngăn chặn các vấn đề như hiện tượng đọc không ổn định (non-repeatable read) hoặc đọc ảo (phantom read), từ đó nâng cao độ tin cậy của dữ liệu.

Trên đây là những thông tin cần biết về transaction SQL. Các bạn cần phải hiểu rõ các câu lệnh của chúng để có thể sử dụng đúng cách nhất.