Не отивайте там.
ORA-04091: table XXXX is mutating
обикновено е добър индикатор, че каквото и да се опитвате да направите, е твърде сложно, за да бъде направено надеждно със задействания.
Разбира се, можете да използвате променлива за масив от пакети и няколко тригера ( уф!) за да заобиколите тази грешка, но вашият код най-вероятно ще:
- да не се поддържа поради сложността си и непредсказуемия характер на тригерите
- не реагира добре на многопотребителска среда
Ето защо трябва да преосмислите подхода си, когато срещнете тази грешка. Съветвам ви да създадете набор от процедури, добре групирани в пакет, за да се справите с последователността между редовете. Отменете всички привилегии за директно извършване на DML таблицата и използвайте само тези процедури, за да я промените.
Например вашата процедура за актуализиране ще бъде атомарна процес, който би:
- получете заключване, за да предотвратите едновременна актуализация на същата група редове (например заключете записа на стаята в приложение за хотелска резервация).
- проверете дали редът, който ще бъде вмъкнат, валидира цялата бизнес логика
- направете всички подходящи DML
- връща всички свои промени (и само своите промени -- не цялата транзакция) в случай на грешка (лесно с PL/SQL, просто повдигнете грешка).