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

Hledání příčiny chyby uváznutí ve trasovacím souboru Oracle

Nejprve select nikdy nic v Oracle neuzamkne, pouze používá poslední dostupnou konzistentní verzi dat. Není to případ pro select ... for update který uzamkne data jako update od Oracle 9i, ale neexistují žádné update klauzule v dotazu z otázky.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       210      72    SX   SSX      208      24    SX   SSX

Relace #72 drží zámek na úrovni stolu (TM) s typem „Row Exclusive“ (SX) a chce získat zámek „Share Row Exclusive“ (SSX) na stejném stole. Tato relace je blokována relací #24, která již obsahuje zámek na úrovni tabulky stejného typu (SX) a čeká, dokud nebude k dispozici zámek SSX.

Resource Name          process session holds waits  process session holds waits
TM-000151a2-00000000       208      24    SX   SSX      210      72    SX   SSX

Tento (druhý řádek) demonstruje přesně stejnou situaci, ale v opačném směru:Relace #24 čeká, až bude dostupný zámek SSX, ale blokována relací #72, která již má zámek SX na stejném stole.

Takže relace #24 a relace #72 se vzájemně blokují:dojde k uváznutí.

Oba typy zámků (SX a SSX) jsou zámky na úrovni tabulky.
Abyste pochopili situaci, doporučuji si přečíst tento článek od Francka Pachota.

Níže je citace z tohoto článku, která se přímo týká vaší situace (všimněte si, že zkratky SSX a SRX jsou ekvivalentní):

Referenční integrita také získává zámky TM. Například společný problém s neindexovanými cizími klíči vede k zámkům S na podřízené tabulce, když provedete odstranění nebo aktualizaci klíče v nadřazené tabulce. Je to proto, že bez indexu nemá Oracle žádný jediný prostředek na nižší úrovni k zablokování, aby zabránil souběžnému vkládání, které by mohlo narušit referenční integritu.
Když jsou sloupce cizího klíče hlavními sloupci v běžném indexu, pak první položka indexu s rodičovská hodnota může být použita jako jeden zdroj a uzamčena pomocí TXlock na úrovni řádku.
A co když má referenční integrita kaskádu při mazání? Kromě režimu S je záměrem aktualizovat řádky v podřízené tabulce, jako u režimu Row X (RX). Zde se vyskytuje sdílení rowexclusive (SRX):S+RX=SRX.

Nejpravděpodobnější variantou tedy je, že relace č. 72 a relace č. 24 odstraní některé řádky v EMPLOYEE tabulky ve stejnou dobu a jsou zde on delete cascade omezení pro EMPSAL_EMP_ID ve spojení s absencí indexu na EMPLOYEE_SALARY tabulka, ve které je EMPSAL_EMP_ID sloupec uveden jako první.




  1. Nainstalujte MySQL Workbench pro správu databáze

  2. Odstranění událostí z protokolu pošty databáze SQL Server (T-SQL)

  3. Úplné šifrování MariaDB v klidu a během přepravy pro maximální ochranu dat – část druhá

  4. Jak vybrat název sloupce s mezerou v MySQL