Điều gì xảy ra ở bước 6?
Giao dịch A thấy định nghĩa cập nhật của chức năng myfunc()
ngay lập tức. (Nhưng hãy xem tác dụng của bộ đệm bên dưới.)
Và nếu chức năng bị bỏ ở bước 4 thay vì bị sửa đổi, bước 6 sẽ thất bại hay thành công?
Nó sẽ thất bại. (Nhưng hãy xem tác dụng của bộ đệm bên dưới.)
Các lệnh DDL của Postgres hoàn toàn giao dịch. Mặc dù giao dịch B không cam kết, cả hai giao dịch sẽ tiếp tục thấy các phiên bản khác nhau của chức năng. Nhưng các giao dịch đồng thời không thấy các thay đổi cam kết trong danh mục hệ thống. Sẽ có vẻ rõ ràng ở mức cô lập mặc định READ COMMITTED
. Nhưng bạn thậm chí không thể ngăn chặn điều này với các mức cô lập REPEATABLE READ
hoặc SERIALIZABLE
.
Nếu bạn nên gọi hàm trong giao dịch A trước khi giao dịch B thực hiện thay đổi, bộ đệm cục bộ có thể can thiệp. Trong các thử nghiệm của tôi, một cuộc gọi nữa đã hoạt động với chức năng được lưu trong bộ nhớ cache (cũ) trước khi cuộc gọi tiếp theo nhận thức được sự thay đổi và được trả lời tương ứng.
Tôi không tìm thấy tài liệu về cách bộ đệm danh mục hệ thống hoạt động chính xác cho điều này (vẫn có thể tồn tại ở đâu đó). Tôi không tin rằng bit cuối cùng (thêm một cuộc gọi được trả lời từ bộ đệm) là hành vi tốt nhất có thể.
BTW, các bước của bạn 3. - 5. có thể giảm xuống chỉ còn 4., không có sự khác biệt. Các trình bao bọc giao dịch rõ ràng hoặc ẩn hoạt động như nhau:
3. Bắt đầu giao dịch từ khách hàng B
4. Trong giao dịch B, sử dụng "tạo hoặc thay thế chức năng" để sửa đổi định nghĩa của myfunc ()
5. Cam kết giao dịch B