Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

BEGIN - END khối giao dịch nguyên tử trong PL / SQL

Đầu tiên, BEGIN..END chỉ là các phần tử cú pháp và không liên quan gì đến các giao dịch.

Thứ hai, trong Oracle, tất cả các câu lệnh DML riêng lẻ đều là nguyên tử (tức là chúng thành công đầy đủ hoặc khôi phục bất kỳ thay đổi trung gian nào trong lần thất bại đầu tiên) (trừ khi bạn sử dụng tùy chọn EXCEPTIONS INTO mà tôi sẽ không trình bày ở đây).

Nếu bạn muốn một nhóm câu lệnh được coi như một giao dịch nguyên tử duy nhất, bạn sẽ làm như sau:

BEGIN
  SAVEPOINT start_tran;
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
EXCEPTION
  WHEN OTHERS THEN
    ROLLBACK TO start_tran;
    RAISE;
END;

Bằng cách đó, bất kỳ ngoại lệ nào sẽ khiến các câu lệnh trong khối này được khôi phục lại, nhưng bất kỳ câu lệnh nào đã được chạy trước khối này sẽ không được khôi phục.

Lưu ý rằng tôi không bao gồm CAM KẾT - thường thì tôi thích quá trình gọi để đưa ra cam kết.

Đúng là khối BEGIN..END không có trình xử lý ngoại lệ sẽ tự động xử lý việc này cho bạn:

BEGIN
  INSERT INTO .... ; -- first DML
  UPDATE .... ; -- second DML
  BEGIN ... END; -- some other work
  UPDATE .... ; -- final DML
END;

Nếu một ngoại lệ được đưa ra, tất cả các nội dung chèn và cập nhật sẽ được khôi phục lại; nhưng ngay khi bạn muốn thêm một trình xử lý ngoại lệ, nó sẽ không khôi phục. Vì vậy, tôi thích phương pháp rõ ràng bằng cách sử dụng các điểm lưu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách xuất kết quả truy vấn sang tệp CSV trong SQLcl (Oracle)

  2. ORACLE SQL:Lấy tất cả các số nguyên giữa hai số

  3. Addnode Resolutionv.conf Failures

  4. Vấn đề so sánh chuỗi PL / SQL của Oracle

  5. Kết nối OEM của bạn với Grafana bằng ứng dụng Trình quản lý doanh nghiệp cho Grafana