Giao dịch tự chủ trong Oracle PL/SQL: Cam kết, Khôi phục

Câu lệnh TCL trong PL/SQL là gì?

TCL là viết tắt của Báo cáo kiểm soát giao dịch. Nó sẽ lưu các giao dịch đang chờ xử lý hoặc khôi phục giao dịch đang chờ xử lý. Các câu lệnh này đóng vai trò quan trọng vì trừ khi giao dịch được lưu, các thay đổi thông qua câu lệnh DML sẽ không được lưu trong cơ sở dữ liệu. Dưới đây là các tuyên bố TCL khác nhau.

CAM KẾT Lưu tất cả các giao dịch đang chờ xử lý
QUAY LẠI Hủy tất cả các giao dịch đang chờ xử lý
TIẾT KIỆM Tạo một điểm trong giao dịch cho đến khi có thể thực hiện khôi phục sau
QUAY LẠI VỀ Hủy tất cả các giao dịch đang chờ xử lý cho đến khi được chỉ định

Giao dịch sẽ hoàn tất trong các trường hợp sau.

  • Khi bất kỳ tuyên bố nào ở trên được đưa ra (ngoại trừ SAVEPOINT)
  • Khi báo cáo DDL được ban hành. (DDL là các câu lệnh tự động cam kết)
  • KHI báo cáo DCL được ban hành. (DCL là các câu lệnh tự động cam kết)

Giao dịch tự chủ là gì

Trong PL/SQL, tất cả các sửa đổi được thực hiện trên dữ liệu sẽ được gọi là giao dịch. Một giao dịch được coi là hoàn tất khi việc lưu/hủy được áp dụng cho nó. Nếu không lưu/hủy thì giao dịch sẽ không được coi là hoàn tất và các sửa đổi được thực hiện trên dữ liệu sẽ không được thực hiện vĩnh viễn trên máy chủ.

Bất kể một số sửa đổi được thực hiện trong một phiên, PL / SQL sẽ coi toàn bộ sửa đổi là một giao dịch duy nhất và việc lưu/hủy giao dịch này sẽ ảnh hưởng đến toàn bộ thay đổi đang chờ xử lý trong phiên đó. Giao dịch tự động cung cấp chức năng cho nhà phát triển, trong đó nó cho phép thực hiện các thay đổi trong một giao dịch riêng biệt và lưu/hủy giao dịch cụ thể đó mà không ảnh hưởng đến giao dịch phiên chính.

  • Giao dịch tự trị này có thể được chỉ định ở cấp độ chương trình con.
  • Để làm cho bất kỳ chương trình con nào hoạt động trong một giao dịch khác, từ khóa 'PRAGMA AUTONOMOUS_TRANSATION' phải được đưa ra trong phần khai báo của khối đó.
  • Nó sẽ hướng dẫn trình biên dịch coi đây là giao dịch riêng biệt và việc lưu/loại bỏ bên trong khối này sẽ không phản ánh trong giao dịch chính.
  • Việc phát hành CAM KẾT hoặc ROLLBACK là bắt buộc trước khi chuyển từ giao dịch tự trị này sang giao dịch chính vì bất kỳ lúc nào cũng chỉ có một giao dịch có thể hoạt động.
  • Vì vậy, khi chúng tôi thực hiện một giao dịch tự trị, chúng tôi cần lưu nó và hoàn tất giao dịch thì chỉ chúng tôi mới có thể quay lại giao dịch chính.

Cú pháp:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • Theo cú pháp trên, khối đã được thực hiện dưới dạng giao dịch tự trị.

Ví dụ 1: Trong ví dụ này, chúng ta sẽ hiểu giao dịch tự trị đang hoạt động như thế nào.

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

Đầu ra

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Giao dịch tự chủ

Giải thích mã:

  • Dòng mã 2: Khai báo l_salary là NUMBER.
  • Dòng mã 3: Khai báo thủ tục Nested_block
  • Dòng mã 4: Tạo thủ tục Nested_block dưới dạng 'AUTONOMOUS_TRANSACTION'.
  • Dòng mã 7-9: Tăng lương cho nhân viên số 1002 lên 15000.
  • Dòng mã 10: Cam kết giao dịch.
  • Dòng mã 13-16: In thông tin chi tiết về mức lương của nhân viên 1001 và 1002 trước khi thay đổi.
  • Dòng mã 17-19: Tăng lương cho nhân viên số 1001 lên 5000.
  • Dòng mã 20: Gọi thủ tục Nested_block;
  • Dòng mã 21: Loại bỏ giao dịch chính.
  • Dòng mã 22-25: In thông tin chi tiết về lương của nhân viên 1001 và 1002 sau khi thay đổi.
  • Việc tăng lương cho nhân viên mã số 1001 không được phản ánh do giao dịch chính đã bị loại bỏ. Việc tăng lương cho nhân viên mã số 1002 được phản ánh do khối đó đã được thực hiện dưới dạng một giao dịch riêng biệt và được lưu ở cuối.
  • Vì vậy, bất kể lưu/hủy ở giao dịch chính, các thay đổi ở giao dịch tự trị đều được lưu mà không ảnh hưởng đến các thay đổi của giao dịch chính.