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

Възможно ли е блокиране при актуализиране и изтриване на различни редове в таблица?

Ако можете да актуализирате въпроса си с графиката на застой, това би било полезна информация. (Когато приложението ви срещне блокиране, Oracle ще издигне ORA-00060 и файл за проследяване ще бъде записан в user_dump_dest.) Ако погледнете файла за проследяване, ще намерите секция, наречена „Графика на застой“. Ако можете да публикувате това и също така да публикувате изявлението, което е причинило безизходицата, и други изявления, участващи в задънената улица, тогава можем да започнем да правим някои заключения. (Цялата информация, която поисках, е налична във файла за проследяване.)

Както Алесандро спомена, е възможно сесиите, които заключват различни редове в една и съща таблица, да се блокират поради неиндексирани външни ключове в дъщерната таблица на връзка родител/подчинение. Също така е възможно да имате блокиране на две сесии, актуализиращи различни редове от една и съща таблица, дори ако таблицата не е част от връзка родител/дете, ако например таблицата има недостиг на ITL записи.

Отново, публикувайте поисканата по-горе информация и съм сигурен, че можем да определим основната причина за вашата задънена улица.

Добавено на 30.07.2012 г. **

Добавяйки следното, сега, след като файлът за проследяване на блокиране е предоставен:Добре, първо, въз основа на съдържанието на файла за проследяване, това е просто блокиране поради припокриване/сблъскване на сесиите в редовете, които се опитват да заключат. Въпреки предишните ви коментари за това, че блокирането е на различно редове, тук съм, за да ви кажа, че това конкретно блокиране се дължи на заключване на ниво ред на същото редове.

Фактът, че графиката за блокиране показва режима, в който се държи заключването, е „X“ (изключителен) и режимът, в който се чака заключването, е „X“, ми казва, че това е просто заключване на ниво ред.

В този случай SID 20 изпълнява „изтриване от RPT_TABLE.TEMP_TABLE_T1, където TEMP_T1_ID=:1“ и вече е заключване на rowid AAAPDIAAMAAAEfIAAA.

Междувременно SID 790 изпълнява „RPT_TABLE.T1_UPDATE_StoredProc“, докато вече държи заключване на rowid AAAPDIAAMAAAEfGAAA.

Забележете от секцията „Редове, чакащи“ на файла за проследяване, че SID 20 чака на реда, който SID 790 държи, а SID 790 чака на реда, който SID 20 държи. Това е класическа безизходица.

Малко допълнителна информация:

  • Типът на опашката е TX (вижте графиката за блокиране), така че това определено не заключване поради неиндексирани външни ключове. Ако се заключваше поради неиндексирани FK, типът на опашката щеше да бъде TM, а не TX. (Има поне още един случай, в който се включват TM опашки и това не са неиндексирани FK. Така че, не приемайте, че TM enqueue винаги означава неиндексирани FK.)

  • Режимът, в който се чака заключването, е „X“ (изключителен), така че това е заключване на ниво ред. Ако чаканият режим беше „S“ (споделен), тогава не да бъде заключване на ниво ред. По-скоро може да е недостиг на ITL или PK или правоприлагане в Обединеното кралство.

Надявам се това да помогне!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. java.lang.ClassCastException:oracle.sql.TIMESTAMP не може да бъде прехвърлен към java.sql.Timestamp

  2. Връщане на стойността на колоната за идентичност след вмъкване в Oracle

  3. Винаги ли 'Select' подрежда по първичен ключ?

  4. Конфигуриране на Pentaho Data Integration за използване на Oracle Wallet за Oracle Cloud

  5. Oracle чете файл от директория с изключение