Nguyên nhân rất có thể gây ra lỗi bảng đột biến là việc sử dụng sai các kích hoạt. Đây là một ví dụ điển hình:
- bạn chèn một hàng vào bảng A
- một kích hoạt trên bảng A (cho mỗi hàng) thực hiện một truy vấn trên bảng A, ví dụ để tính toán một cột tóm tắt
- Oracle ném ORA-04091: bảng A đang biến đổi, kích hoạt / chức năng có thể không thấy nó
Đây là một hành vi được mong đợi và bình thường, Oracle muốn bảo vệ bạn khỏi chính bạn vì Oracle đảm bảo:
- (i) rằng mỗi tuyên bố là nguyên tử (nghĩa là sẽ thất bại hoặc thành công hoàn toàn)
- (ii) rằng mỗi tuyên bố nhìn thấy một quan điểm nhất quán về dữ liệu
Rất có thể khi bạn viết loại kích hoạt này, bạn sẽ mong muốn truy vấn (2) sẽ thấy hàng được chèn vào (1). Điều này sẽ mâu thuẫn với cả hai điểm trên vì bản cập nhật chưa kết thúc (có thể có nhiều hàng được chèn vào).
Oracle có thể trả về kết quả phù hợp với một thời điểm ngay trước khi bắt đầu tuyên bố nhưng từ hầu hết các ví dụ tôi đã thấy rằng cố gắng thực hiện logic này, mọi người thấy một tuyên bố nhiều hàng như một chuỗi các bước kế tiếp và mong đợi tuyên bố [2] để xem các thay đổi được thực hiện bởi các bước trước. Oracle không thể trả về kết quả mong đợi và do đó ném lỗi.
Để đọc thêm: "bảng đột biến" trên Ask Tom .
Nếu như tôi nghi ngờ nguyên nhân gây ra lỗi bảng đột biến là một trình kích hoạt, thì một cách để tránh lỗi là chuyển logic ra khỏi trình kích hoạt thành các thủ tục.