PL / SQL - Giao dịch

Trong chương này, chúng ta sẽ thảo luận về các giao dịch trong PL / SQL. Một cơ sở dữ liệutransactionlà một đơn vị công việc nguyên tử có thể bao gồm một hoặc nhiều câu lệnh SQL liên quan. Nó được gọi là nguyên tử vì các sửa đổi cơ sở dữ liệu do các câu lệnh SQL tạo thành một giao dịch mang lại có thể được cam kết chung, tức là được thực hiện vĩnh viễn với cơ sở dữ liệu hoặc được khôi phục (hoàn tác) từ cơ sở dữ liệu.

Một câu lệnh SQL được thực thi thành công và một giao dịch đã cam kết không giống nhau. Ngay cả khi một câu lệnh SQL được thực thi thành công, trừ khi giao dịch chứa câu lệnh được cam kết, nó có thể được khôi phục và tất cả các thay đổi được thực hiện bởi (các) câu lệnh có thể được hoàn tác.

Bắt đầu và Kết thúc Giao dịch

Một giao dịch có một beginning và một end. Giao dịch bắt đầu khi một trong các sự kiện sau diễn ra:

  • Câu lệnh SQL đầu tiên được thực hiện sau khi kết nối với cơ sở dữ liệu.

  • Tại mỗi câu lệnh SQL mới được phát hành sau khi hoàn thành một giao dịch.

Giao dịch kết thúc khi một trong các sự kiện sau diễn ra:

  • A COMMIT hoặc một ROLLBACK tuyên bố được phát hành.

  • A DDL tuyên bố, chẳng hạn như CREATE TABLEtuyên bố, được phát hành; bởi vì trong trường hợp đó, một COMMIT được tự động thực hiện.

  • A DCL tuyên bố, chẳng hạn như một GRANTtuyên bố, được phát hành; bởi vì trong trường hợp đó, một COMMIT được tự động thực hiện.

  • Người dùng ngắt kết nối với cơ sở dữ liệu.

  • Người dùng thoát khỏi SQL*PLUS bằng cách phát hành EXIT lệnh COMMIT được thực hiện tự động.

  • SQL * Plus kết thúc bất thường, ROLLBACK được thực hiện tự động.

  • A DMLtuyên bố không thành công; trong trường hợp đó, một ROLLBACK được tự động thực hiện để hoàn tác câu lệnh DML đó.

Thực hiện một giao dịch

Một giao dịch được thực hiện vĩnh viễn bằng cách đưa ra lệnh SQL COMMIT. Cú pháp chung cho lệnh COMMIT là:

COMMIT;

Ví dụ,

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (1, 'Ramesh', 32, 'Ahmedabad', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (2, 'Khilan', 25, 'Delhi', 1500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (3, 'kaushik', 23, 'Kota', 2000.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (4, 'Chaitali', 25, 'Mumbai', 6500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (5, 'Hardik', 27, 'Bhopal', 8500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (6, 'Komal', 22, 'MP', 4500.00 ); 

COMMIT;

Giao dịch quay vòng

Các thay đổi được thực hiện đối với cơ sở dữ liệu mà không có COMMIT có thể được hoàn tác bằng lệnh ROLLBACK.

Cú pháp chung cho lệnh ROLLBACK là:

ROLLBACK [TO SAVEPOINT < savepoint_name>];

Khi một giao dịch bị hủy bỏ do một số tình huống chưa từng có, chẳng hạn như lỗi hệ thống, toàn bộ giao dịch kể từ khi cam kết sẽ tự động được khôi phục. Nếu bạn không sử dụngsavepoint, sau đó chỉ cần sử dụng câu lệnh sau để khôi phục tất cả các thay đổi:

ROLLBACK;

Điểm lưu

Điểm lưu là loại điểm đánh dấu giúp chia một giao dịch dài thành các đơn vị nhỏ hơn bằng cách thiết lập một số điểm kiểm tra. Bằng cách thiết lập các điểm lưu trong một giao dịch dài, bạn có thể quay trở lại điểm kiểm tra nếu cần. Điều này được thực hiện bằng cách phát hànhSAVEPOINT chỉ huy.

Cú pháp chung cho lệnh SAVEPOINT là:

SAVEPOINT < savepoint_name >;

Ví dụ

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (7, 'Rajnish', 27, 'HP', 9500.00 ); 

INSERT INTO CUSTOMERS (ID,NAME,AGE,ADDRESS,SALARY) 
VALUES (8, 'Riddhi', 21, 'WB', 4500.00 ); 
SAVEPOINT sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000; 
ROLLBACK TO sav1;
  
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 7; 
UPDATE CUSTOMERS 
SET SALARY = SALARY + 1000 
WHERE ID = 8; 

COMMIT;

ROLLBACK TO sav1 - Câu lệnh này khôi phục tất cả các thay đổi cho đến thời điểm mà bạn đã đánh dấu sav1 savepoint.

Sau đó, các thay đổi mới mà bạn thực hiện sẽ bắt đầu.

Kiểm soát giao dịch tự động

Để thực hiện một COMMIT tự động bất cứ khi nào INSERT, UPDATE hoặc là DELETE lệnh được thực thi, bạn có thể đặt AUTOCOMMIT biến môi trường là -

SET AUTOCOMMIT ON;

Bạn có thể tắt chế độ cam kết tự động bằng lệnh sau:

SET AUTOCOMMIT OFF;