Tôi đang đối mặt với một sự cố bế tắc từ một hàm PL/pgSQL trong cơ sở dữ liệu PostgreSQL của tôi. Vui lòng tìm câu lệnh SQL trong khối mã (chỉ cần ví dụ):Lỗi bế tắc được phát hiện trong hàm PL/pgSQL
BEGIN
UPDATE accounts SET balance = 0 WHERE acct_name like 'A%';
UPDATE accounts SET balance = balance + 100 WHERE acct_name like '%A';
EXCEPTION WHEN OTHERS THEN RAISE NOTICE SQLERRM;
END;
Tôi đã tìm thấy bế tắc xảy ra trong khi phát biểu này đang chạy. Nhưng tôi không chắc rằng có những phát biểu khác đang cố gắng cập nhật bảng này trong cùng một thời điểm (vì tôi không tìm thấy bất kỳ điều gì trong hệ thống đăng nhập của tôi).
Vì vậy, có thể xảy ra bế tắc trong tuyên bố này không? Theo tôi biết, nếu chúng tôi chặn toàn bộ tuyên bố với BEGIN
/END
. Sẽ có cùng một giao dịch và không nên tự khóa.
Bạn có bất kỳ trình kích hoạt nào trên tài khoản không? Ngoài ra bạn có sử dụng khóa rõ ràng không? – strkol
Theo mặc định, giao dịch có thể quan sát các thay đổi do các giao dịch khác thực hiện. Để biết thêm thông tin, xem [Cách ly giao dịch] (http://www.postgresql.org/docs/current/static/transaction-iso.html) từ tài liệu PostgreSQL. –
@strkol Có, nhưng tuyên bố trong trình kích hoạt đó không liên quan đến bảng này. Đối với khóa rõ ràng cũng có. –