Nechoďte tam.
ORA-04091: table XXXX is mutating
je obecně dobrým ukazatelem toho, že cokoli, o co se pokoušíte, je příliš složité na to, aby to bylo spolehlivě se spouštěči.
Jistě, můžete použít proměnnou pole balíčků a několik spouštěčů ( fuj!) abyste tuto chybu obešli, ale váš kód s největší pravděpodobností:
- nebude udržovatelný kvůli své složitosti a nepředvídatelné povaze spouštěčů
- nereagují dobře na prostředí s více uživateli
To je důvod, proč byste měli přehodnotit svůj přístup, když narazíte na tuto chybu. Doporučuji vám vytvořit sadu procedur pěkně seskupených do balíčku, abyste se vypořádali s konzistencí mezi řádky. Odeberte všechna oprávnění k přímému provádění DML tabulky a použijte pouze tyto procedury k její úpravě.
Například váš postup aktualizace by byl atomový proces, který by:
- získat zámek, aby se zabránilo souběžné aktualizaci stejné skupiny řádků (například zamknutí záznamu pokoje v aplikaci pro rezervaci hotelu).
- zkontrolujte, zda řádek, který má být vložen, ověřuje veškerou obchodní logiku
- vytvořit všechny relevantní DML
- v případě chyby vrátí zpět všechny své změny (a pouze změny – ne celou transakci) (snadné s PL/SQL, stačí vyvolat chybu).