Bản cập nhật PostgreSQL 12 :hỗ trợ hạn chế cho PROCEDURE
cấp cao nhất s có thể kiểm soát giao dịch. Bạn vẫn không thể quản lý các giao dịch trong các hàm SQL-có thể gọi thông thường, vì vậy điều dưới đây vẫn đúng ngoại trừ khi sử dụng các thủ tục cấp cao nhất mới.
Các chức năng là một phần của giao dịch mà chúng được gọi từ đó. Hiệu ứng của chúng sẽ được quay trở lại nếu giao dịch quay trở lại. Công việc của họ cam kết nếu giao dịch được cam kết. Mọi BEGIN ... EXCEPT
các khối bên trong hàm hoạt động giống như (và sử dụng ẩn) các điểm lưu như SAVEPOINT
và ROLLBACK TO SAVEPOINT
Câu lệnh SQL.
Hàm thành công toàn bộ hoặc không thành công toàn bộ, chặn BEGIN ... EXCEPT
xử lý lỗi. Nếu một lỗi được phát sinh trong hàm và không được xử lý, giao dịch gọi hàm sẽ bị hủy bỏ. Các giao dịch bị hủy bỏ không thể cam kết và nếu chúng cố gắng cam kết COMMIT
được coi là ROLLBACK
, giống như đối với bất kỳ giao dịch bị lỗi nào khác. Quan sát:
regress=# BEGIN;
BEGIN
regress=# SELECT 1/0;
ERROR: division by zero
regress=# COMMIT;
ROLLBACK
Xem cách giao dịch đang ở trạng thái lỗi do phép chia 0, quay trở lại COMMIT
?
Nếu bạn gọi một hàm mà không có giao dịch bao quanh rõ ràng, các quy tắc giống hệt như đối với bất kỳ câu lệnh Pg nào khác:
BEGIN;
SELECT refresh_materialized_view(name);
COMMIT;
(trong đó COMMIT
sẽ không thành công nếu SELECT
đã xảy ra lỗi).
PostgreSQL không (chưa) hỗ trợ các giao dịch tự trị trong các hàm, trong đó thủ tục / hàm có thể cam kết / khôi phục độc lập với giao dịch gọi. Điều này có thể được mô phỏng bằng một phiên mới thông qua dblink.
NHƯNG , những thứ không mang tính giao dịch hoặc giao dịch không hoàn hảo tồn tại trong PostgreSQL. Nếu nó có hành vi không giao dịch trong BEGIN; do stuff; COMMIT;
, nó cũng có hành vi không giao dịch trong một chức năng. Ví dụ:nextval
và setval
, TRUNCATE
, v.v.