Oracle
 sql >> база данни >  >> RDS >> Oracle

Намиране на причината за грешка в блокиране от файла за проследяване на Oracle

Първо, select изявлението никога не заключва нищо в Oracle, просто използва последната налична последователна версия на данните. Това не е случай за select ... for update който заключва данни като update от Oracle 9i, но няма for update клауза в заявката от въпрос.

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

Сесия #72 държи заключване на ниво таблица (TM) с тип "Изключителен ред" (SX) и искате да получите заключване "Изключително споделяне на ред" (SSX) на същата маса. Тази сесия е блокирана от сесия #24, която вече държи заключване на ниво таблица от същия тип (SX) и изчаква, докато SSX заключването ще бъде налично.

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

Това (втори ред) демонстрира точно същата ситуация, но в обратна посока:сесия #24 изчаква заключване на SSX да стане достъпна, но блокирана от сесия #72, която вече държи SX заключване на същата маса.

И така, сесии #24 и сесия #72 се блокират взаимно:възниква безизходица.

И двата типа заключване (SX и SSX) са ключалки на ниво таблица.
За да разберете ситуацията, препоръчвам да прочетете тази статия от Franck Pachot.

По-долу е цитат от тази статия, който е пряко свързан с вашата ситуация (обърнете внимание, че съкращенията SSX и SRX са еквивалентни):

Референтната цялост придобива и TM ключалки. Например, често срещаният проблем с неиндексирани външни ключове води до S заключвания на дъщерна таблица, когато издадете изтриване или актуализиране на ключа на родителската таблица. Това е така, защото без индекс Oracle няма един единствен ресурс от по-ниско ниво за заключване, за да предотврати едновременно вмъкване, което може да наруши референтната цялост.
Когато колоните с външния ключ са водещите колони в обикновен индекс, тогава първият запис в индекса с родителската стойност може да се използва като единичен ресурс и да се заключи с TXlock на ниво ред.
И какво, ако референтната цялост има каскада за изтриване? В допълнение към режима S, има намерение да се актуализират редове в дъщерната таблица, както при режим на ред X (RX). Това е мястото, където се появява изключителният ред за споделяне (SRX):S+RX=SRX.

Така че, най-вероятният вариант е, че сесия #72 и сесия #24 изтриват някои редове в EMPLOYEE таблица в същото време и има on delete cascade ограничение за EMPSAL_EMP_ID във връзка с липсата на индекс на EMPLOYEE_SALARY таблица, в която EMPSAL_EMP_ID колона, посочена първа.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Потърсете стойност в стойността на колоната, която съхранява стойности, разделени със запетая

  2. ORACLE SQL:Вземете всички цели числа между две числа

  3. Разлика в критериите за търсене между Like срещу Contains() в oracle

  4. Как да конвертирате редове в колона в таблицата на Oracle

  5. ORACLE - ORA-01843:не е валиден месец