Các nguyên nhân và giải pháp cho các lỗi bảng đột biến là gì?


12

Tôi hiểu lỗi bảng đột biến là do lỗi thiết kế hoặc truy vấn có vấn đề.

Một truy vấn cũ gần đây đã được đưa vào sản xuất, gây ra lỗi bảng đột biến. DBA của chúng tôi đã giải quyết vấn đề nhưng chúng tôi không biết làm thế nào.

Điều gì chính xác gây ra lỗi bảng đột biến và làm thế nào DBA của chúng tôi đã khắc phục vấn đề?

Câu trả lời:


17

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:

  1. bạn chèn một hàng vào bảng A
  2. 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
  3. 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.


9

Một bảng đột biến xảy ra khi một câu lệnh gây ra một kích hoạt kích hoạt và kích hoạt đó tham chiếu bảng gây ra kích hoạt. Cách tốt nhất để tránh những vấn đề như vậy là không sử dụng các kích hoạt, nhưng tôi nghi ngờ rằng DBA đã không dành thời gian để làm điều đó. Anh ta có thể đã làm một trong những điều sau đây:


1
Ít nhất là đối với tôi, việc thay đổi thành trình kích hoạt sau thất bại vào ngày 11.2.0.4.0
Nguồn nhanh nhất

Cũng cho tôi; phiên bản 12.1.0.2.0 và SAU không hoạt động.
eidylon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.