Bạn đang sử dụng một giao dịch tự trị để giải quyết thực tế là trình kích hoạt không thể tự truy vấn bảng của nó. Bạn đã gặp phải lỗi bảng đột biến khét tiếng và bạn nhận thấy rằng việc khai báo trình kích hoạt là một giao dịch tự trị sẽ làm cho lỗi biến mất.
Tuy nhiên, không may mắn cho bạn, điều này không giải quyết được vấn đề gì cả:
- Đầu tiên, mọi logic giao dịch đều bị mất. Bạn không thể khôi phục các thay đổi trên
suscription_fact
bảng, họ cam kết , trong khi giao dịch chính của bạn thì không và có thể được hoàn lại. Vì vậy, bạn cũng đã đánh mất tính toàn vẹn của dữ liệu. - Trình kích hoạt không thể nhìn thấy hàng mới vì hàng mới chưa được cam kết! Vì trình kích hoạt chạy trong một giao dịch độc lập, nó không thể nhìn thấy những thay đổi không được cam kết được thực hiện bởi giao dịch chính:bạn sẽ gặp phải kết quả hoàn toàn sai.
Đây là lý do tại sao bạn không bao giờ nên thực hiện bất kỳ logic kinh doanh nào trong các giao dịch tự trị. (có những ứng dụng hợp pháp nhưng chúng hầu như bị giới hạn hoàn toàn trong việc ghi nhật ký / gỡ lỗi).
Trong trường hợp của bạn, bạn nên:
- Cập nhật logic của bạn để nó không cần truy vấn bảng của bạn (cập nhật
suscription_fact
chỉ khi hàng mới gần đây hơn giá trị cũ được lưu trữ trongid_date_unsuscription
). - Quên việc sử dụng logic nghiệp vụ trong trình kích hoạt và sử dụng quy trình cập nhật tất cả các bảng một cách chính xác hoặc sử dụng chế độ xem vì ở đây chúng tôi có một trường hợp rõ ràng về dữ liệu dư thừa.
- Sử dụng giải pháp thực sự hiệu quả (bởi Tom Kyte) .
Tôi thực sự khuyên bạn nên sử dụng (2) ở đây. Không sử dụng trình kích hoạt để viết mã logic nghiệp vụ. Chúng khó viết mà không có lỗi và khó duy trì hơn. Việc sử dụng một quy trình đảm bảo rằng tất cả các mã liên quan được nhóm vào một nơi (một gói hoặc một quy trình), dễ đọc và làm theo và không có hậu quả không lường trước được.