Transaction trong SQL Server

2544 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. Cá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

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

Trong transaction SQL server có các lệnh xử lý:

  • COMMIT trong SQL:
  • ROLLBACK trong SQL
  • SAVEPOINT trong SQL
  • RELEASE SAVEPOINT trong SQL

2.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;

COMMIT;

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

1

2

3

4

5

6

7

8

9

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

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

2.3 Lệnh SAVEPOINT trong SQL

Trong transaction, 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:

1

2

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.

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

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

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.