SQL - Giao dịch

Giao dịch là một đơn vị công việc được thực hiện dựa trên cơ sở dữ liệu. Giao dịch là các đơn vị hoặc chuỗi công việc được thực hiện theo một thứ tự logic, cho dù là theo cách thủ công bởi người dùng hay tự động bởi một số loại chương trình cơ sở dữ liệu.

Giao dịch là sự truyền bá một hoặc nhiều thay đổi đối với cơ sở dữ liệu. Ví dụ: nếu bạn đang tạo bản ghi hoặc cập nhật bản ghi hoặc xóa bản ghi khỏi bảng, thì bạn đang thực hiện một giao dịch trên bảng đó. Điều quan trọng là phải kiểm soát các giao dịch này để đảm bảo tính toàn vẹn của dữ liệu và xử lý các lỗi cơ sở dữ liệu.

Thực tế, bạn sẽ kết hợp nhiều truy vấn SQL thành một nhóm và bạn sẽ thực hiện tất cả chúng cùng nhau như một phần của giao dịch.

Thuộc tính của giao dịch

Giao dịch có bốn thuộc tính tiêu chuẩn sau, thường được gọi bằng từ viết tắt ACID.

  • Atomicity- đảm bảo rằng tất cả các hoạt động trong đơn vị công việc được hoàn thành thành công. Nếu không, giao dịch sẽ bị hủy bỏ tại điểm không thành công và tất cả các hoạt động trước đó sẽ được khôi phục về trạng thái cũ.

  • Consistency - đảm bảo rằng cơ sở dữ liệu thay đổi đúng trạng thái khi giao dịch được cam kết thành công.

  • Isolation - cho phép các giao dịch hoạt động độc lập và minh bạch với nhau.

  • Durability - đảm bảo rằng kết quả hoặc hiệu lực của một giao dịch đã cam kết vẫn tồn tại trong trường hợp hệ thống bị lỗi.

Kiểm soát giao dịch

Các lệnh sau được sử dụng để kiểm soát các giao dịch.

  • COMMIT - để lưu các thay đổi.

  • ROLLBACK - để quay lại các thay đổi.

  • SAVEPOINT - tạo điểm trong các nhóm giao dịch để QUAY LẠI.

  • SET TRANSACTION - Đặt tên cho một giao dịch.

Lệnh điều khiển giao dịch

Các lệnh điều khiển giao dịch chỉ được sử dụng với DML Commandschẳng hạn như - chỉ INSERT, UPDATE và DELETE. Chúng không thể được sử dụng trong khi tạo bảng hoặc bỏ chúng vì các hoạt động này được tự động cam kết trong cơ sở dữ liệu.

Lệnh COMMIT

Lệnh COMMIT là lệnh giao dịch được sử dụng để lưu các thay đổi được gọi bởi một giao dịch vào cơ sở dữ liệu.

Lệnh COMMIT là lệnh giao dịch được sử dụng để lưu các thay đổi được gọi bởi một giao dịch vào cơ sở dữ liệu. Lệnh COMMIT lưu tất cả các giao dịch vào cơ sở dữ liệu kể từ lệnh COMMIT hoặc ROLLBACK cuối cùng.

Cú pháp của lệnh COMMIT như sau.

COMMIT;

Example

Hãy xem xét bảng KHÁCH HÀNG có các bản ghi 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 |
+----+----------+-----+-----------+----------+

Sau đây là một ví dụ sẽ xóa các bản ghi đó khỏi bảng có age = 25 và sau đó COMMIT các thay đổi trong cơ sở dữ liệu.

SQL> DELETE FROM CUSTOMERS
   WHERE AGE = 25;
SQL> COMMIT;

Do đó, hai hàng trong bảng sẽ bị xóa và câu lệnh SELECT sẽ tạo ra 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

Lệnh ROLLBACK là lệnh giao dịch được sử dụng để hoàn tác các giao dịch 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 giao dịch kể từ khi lệnh COMMIT hoặc ROLLBACK cuối cùng được phát hành.

Cú pháp cho lệnh ROLLBACK như sau:

ROLLBACK;

Example

Hãy xem xét bảng KHÁCH HÀNG có các bản ghi 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 |
+----+----------+-----+-----------+----------+

Sau đây là một ví dụ, sẽ xóa các bản ghi đó khỏi bảng có age = 25 và sau đó QUAY LẠI các thay đổi trong cơ sở dữ liệu.

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

Do đó, thao tác xóa sẽ không ảnh hưởng đến bảng và câu lệnh SELECT sẽ tạo ra kết quả 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 |
+----+----------+-----+-----------+----------+

Lệnh SAVEPOINT

SAVEPOINT là một điểm trong giao dịch khi bạn có thể chuyển giao dịch trở lại một điểm nhất định mà không cần lùi lại toàn bộ giao dịch.

Cú pháp của lệnh SAVEPOINT như hình dưới đây.

SAVEPOINT SAVEPOINT_NAME;

Lệnh này chỉ phục vụ trong việc tạo SAVEPOINT trong số tất cả các câu lệnh giao dịch. Lệnh ROLLBACK được sử dụng để hoàn tác một nhóm giao dịch.

Cú pháp quay trở lại SAVEPOINT như hình dưới đây.

ROLLBACK TO SAVEPOINT_NAME;

Sau đây là một ví dụ mà bạn định xóa ba bản ghi khác nhau khỏi bảng CUSTOMERS. Bạn muốn tạo một SAVEPOINT trước mỗi lần xóa, để bạn có thể QUAY LẠI bất kỳ SAVEPOINT nào bất kỳ lúc nào để trả dữ liệu thích hợp về trạng thái ban đầu.

Example

Hãy xem xét bảng KHÁCH HÀNG có các bản ghi 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 |
+----+----------+-----+-----------+----------+

Khối mã sau đây chứa một 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 đã diễn ra, hãy giả sử rằng bạn đã thay đổi ý định và quyết định QUAY LẠI về SAVEPOINT mà bạn đã xác định là SP2. Vì SP2 được tạo sau lần xóa đầu tiên, hai lần xóa cuối cùng sẽ được hoàn tác -

SQL> ROLLBACK TO SP2;
Rollback complete.

Lưu ý rằng chỉ lần xóa đầu tiên diễn ra kể từ khi bạn quay trở lại SP2.

SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  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 |
+----+----------+-----+-----------+----------+
6 rows selected.

Lệnh RELEASE SAVEPOINT

Lệnh RELEASE SAVEPOINT được sử dụng để xóa SAVEPOINT mà bạn đã tạo.

Cú pháp cho lệnh RELEASE SAVEPOINT như sau.

RELEASE SAVEPOINT SAVEPOINT_NAME;

Sau khi SAVEPOINT đã được phát hành, bạn không thể sử dụng lệnh ROLLBACK để hoàn tác các giao dịch được thực hiện kể từ SAVEPOINT cuối cùng.

Lệnh SET GIAO DỊCH

Lệnh SET TRANSACTION có thể được sử dụng để bắt đầu một giao dịch cơ sở dữ liệu. Lệnh này được sử dụng để chỉ định các đặc điểm cho giao dịch sau đó. Ví dụ: bạn có thể chỉ định một giao dịch là chỉ đọc hoặc đọc ghi.

Cú pháp của lệnh SET TRANSACTION như sau.

SET TRANSACTION [ READ WRITE | READ ONLY ];