sql >> Databáze >  >> RDS >> Oracle

Zrušte operaci vložení/aktualizace ve spouštěči pomocí PL/SQL

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:

  1. 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).
  2. zkontrolujte, zda řádek, který má být vložen, ověřuje veškerou obchodní logiku
  3. vytvořit všechny relevantní DML
  4. 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).



  1. Je jméno speciální klíčové slovo v PostgreSQL?

  2. Návrh databáze

  3. Návrh struktury databáze s proměnlivým počtem polí

  4. php - mysql ukládající stará data