it-swarm-eu.dev

Jaké jsou příčiny a řešení mutací chyb tabulky?

Chápu, že chyby v mutační tabulce jsou způsobeny konstrukční vadou nebo problematickým dotazem.

Nedávno byl uveden do výroby starý dotaz, který vyvolá chybu mutující tabulky. Naše DBA problém vyřešila, ale nevíme jak.

Co přesně způsobuje chyby mutace tabulky a jak by náš problém vyřešil náš DBA?

12
parmanand

Nejpravděpodobnější příčinou chyby mutující tabulky je zneužití spouštěčů. Zde je typický příklad:

  1. vložíte řádek do tabulky A
  2. spouštěč v tabulce A (pro každý řádek) provede dotaz v tabulce A, například pro výpočet souhrnného sloupce
  3. Oracle vyvolá ORA-04091: tabulka A mutuje, spouštěč/funkce ji nemusí vidět

Toto je očekávané a normální chování, které vás společnost Oracle chce chránit před sebou, protože společnost Oracle zaručuje:

  • (i) že každý příkaz je atomový (tj. buď selže, nebo úplně uspěje)
  • (ii) že každý výkaz vidí konzistentní pohled na údaje

Nejpravděpodobnější je, když při psaní tohoto typu spouštěče očekáváte, že dotaz (2) uvidí řádek vložený do (1). To by bylo v rozporu s oběma body výše, protože aktualizace ještě není dokončena (může být vloženo více řádků).

Oracle mohl vrátit výsledek konzistentní s časovým okamžikem těsně před začátek prohlášení, ale z většiny příkladů, které jsem viděl, jak se snaží tuto logiku implementovat, lidé vidí víceřádkový příkaz jako řadu po sobě jdoucích kroků a očekávají, že prohlášení [2] uvidí změny provedené v předchozích krocích. Oracle nemůže vrátit očekávaný výsledek, a proto vyvolá chybu.

Pro další čtení: "mutující tabulka" na Ask Tom .

Pokud se domnívám, že příčinou chyby mutační tabulky je spoušť, jedním ze způsobů, jak se této chybě vyhnout, je přesunout logiku z spouště do procedur.

17
Vincent Malgrat

mutační tabulka nastane, když příkaz způsobí spuštění spouštěče a který spustí odkazy na tabulku, která způsobila spuštění. Nejlepším způsobem, jak se těmto problémům vyhnout, je nepoužívat spouště, ale mám podezření, že DBA na to neudělal čas. Mohl udělat jeden z následujících:

9
Leigh Riffel