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

Oracle Брави и ключалки за маса:Как работи

Базата данни Oracle е широко използваната база данни в индустрията. Тук се опитвам да обясня  за заключванията на Oracle, заключванията на таблици на Oracle

Съдържание

Какво е Oracle Enqueue и заключвания

Enqueue са ключалки на Oracle, които сериализират операциите към споделената структура. Споделената структура може да бъде таблица, повторни нишки и транзакции.

Когато потребител A актуализира ред 12 в таблицата, той придобива транзакцията Enqueue (lock). Това е придобито, така че всеки потребител, който се опитвам да актуализирам същия ред 12 в таблицата, ще изчака, докато потребителят A извърши транзакцията. Така че сега, ако потребител B се опита да актуализира същия ред, той ще изчака в опашката.

След като потребител А извърши транзакцията, транзакцията на потребител Б ще продължи

Имаме локална опашка в единичната база данни, докато с Oracle RAC имаме локална опашка и глобална опашка за управление на споделения ресурс

Какво е идентификатор на Enqueue

Опашката се идентифицира уникално с помощта на формата

<Тип ресурс>

Ресурс може

TM -> ключалки за маса

MR-> Възстановяване на носител

TX-> Транзакция

Id1 и id2 са числа, които са различни за различните типове ресурс

Подобно на заключване на маса (TM), той се записва като

TM-<идентификатор на обекта на таблицата>-0

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

В този режим се задържат опашки

SS:  Режим на споделяне на ред

SX:Изключителен режим на ред

S:  Заключете таблицата в режим на споделяне

SSX:Заключете таблицата в режим на споделяне и ред в изключителен режим

X:Заключете масата в изключителен режим

Какво е Enqueue ресурс

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

  1. Списък със собственици
  2. Списък с чакащи
  3. Списък с конвертори

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

Така че потребителят   първо иска този ресурс, след което той ще бъде поставен в списъка със собственици

Структурата на ресурсите се получава от таблицата с ресурси, а структурата на заключването се получава от таблицата за заключване. И двете са разпределени в SGA

Броят на редовете в таблицата с ресурси се определя от параметъра за инициализация enqueue_resources. Използваните стойности могат да се видят в v$resource view

Броят на редовете в таблицата със структура на заключване се дефинира от параметъра за инициализация _enqueue_locks. Използваните стойности могат да се видят във v$enqueue_lock

Как се извършва търсенето в таблицата с ресурси?

  • Таблицата с ресурси съдържа цялата структура на ресурсите. Алгоритъм за хеширане се използва за намиране и достъп до структурата на ресурсите в таблицата с ресурси.
  • Таблицата с ресурси е подредена в хеш кофа. Всяка хеш кофа съдържа списък със структурата на ресурсите във формата на свързан списък.
  • Когато ресурсът се търси, неговият хеш се получава с помощта на алгоритъм за хеширане и след това се получава ключалката за намиране на съответната хеш кофа и след това ресурсът се търси в списъка в хеш кофата. Ако ресурсът бъде намерен, структурата на заключване се получава и заявката се поставя на  собственик, сервитьор и списък за преобразуване според посоченото изисквано ниво на заключване

Пример TM-575-0 ресурс, хеширан към кофа 1, се получава хеш верига на заключваща опашка за достъп до хеш кофата и списъкът е достъпен в кофата, за да се получи структурата на ресурса

  • Ако ресурсът не е намерен в bucket list и нова структура на ресурсите е получена от списъка без ресурси и е поставена в списъка. Това се случва под ключалката Enqueue. Разпределена е и заключваща структура

Заявката за заключване се поставя в списъка на собствениците на структурата на ресурсите

Как работят операциите с опашка?

Когато потребител поиска заключване на ресурса, сървърът на Oracle прави следните неща

  • Ако в момента не се притежава, ресурсът се предоставя на потребителя
  • Ако е собственост и има сервитьори и конвертор, тогава се поставя в дъното на опашката на сервитьори
  • Ако е собственост, но няма сервитьор и преобразувател, тогава ако е съвместим с заключването на собственика, заявката се удовлетворява. Ако не е съвместим, той се поставя  в списъка на сервитьори
  • Преобразувателят е разрешен да продължи, ако заявката е по-малко ограничителна от заключената в момента или заявеният режим е съвместим със заключването, държано от другия собственик
  • На сервитьор е разрешено да продължи, ако списъкът с конвертори е празен, няма сервитьори пред него и исканото заключване е съвместимо с заключването, което има в момента.
  • Конверторът винаги се обработва преди сервитьорите.
  • Oracle сървър проверява тези опашки всеки път, когато заключването бъде освободено или преобразувано.

Как се проверява опашката при освобождаване или преобразуване на Oracle lock

  • Процеси, които чакат ресурсите да спят върху семафорите, а семафорите се използват като механизми за заспиване/събуждане. След като се постави в опашката, процесът на заявка ще заспи на семафора, използвайки извикването sync_op.

sync_op(SYNC_WAIT, SYNCF_BINARY, 300) =1

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

sync_op извикване.

sync_op(0x0005, SYNCF_BINARY, 134491620) =1

  • Процесът на изчакване ще обработи сигнала и ще се събуди. Този процес на изчакване променя състоянието според стъпките, дадени в операцията на опашката

Общи типове опашка

JQ – Опашка за задания. Когато дадено задание (подадено от DBMS_JOB.SUBMIT) се изпълнява, то е защитено от JQ опашка (което означава, че само един SNP-процес може да изпълни заданието).

ST – транзакция за управление на пространството . ST опашката трябва да се държи всеки път, когато сесията разпределя/освобождава екстенти (което означава , че иска да промени речниковите таблици UET$ и FET$), като обединяване, пускане/съкращаване на сегменти и дисково сортиране. Ако сесията получи изчакване при заявка на ST опашката, се връща „ORA-1575 изчакване на изчакване за управление на пространството“.

TM – DML (таблица)  поредица. Всеки път, когато сесия иска да заключи таблица, се изисква TM опашка. Ако сесия изтрие ред в таблицата-родител (DEPT) и се създаде референтно ограничение (външен ключ) без индекс на дъщерната таблица (EMP) или ако сесията актуализира колоната(ите), които чуждата ключови препратки към след това заключване на споделяне (ниво 4)  се приема на дъщерната маса. Ако друга сесия се опита да направи промени в дъщерната таблица, те трябва да изчакат (защото искат опашката в изключителен режим на ред, а това не е съвместимо с режима на споделяне). Ако е създаден индекс в колоната с външен ключ на дъщерната таблица, тогава не се изисква заключване на споделяне на дъщерната таблица.

TX – транзакция. Веднага след като транзакцията започне, е необходима TX опашка. Транзакцията е уникално дефинирана от номера на сегмента за връщане назад, номера на слота в таблицата на транзакциите на сегмента за връщане и поредния номер на слота. Една сесия може да чака на TX опашка поради няколко причини:

1) Друга сесия заключва заявения ред.

2) Когато две сесии се опитат да вмъкнат един и същ уникален ключ в таблица (никоя от тях не е извършила COMMIT), тогава последната сесия изчаква първата да COMMIT или ROLLBACK.

3) Няма безплатни ITL (списък на заинтересованите транзакции) в заглавката на блока (увеличете INI_TRANS и PCT_FREE за сегмента).

UL – User Lock . Сесия се заключи с функцията DBMS_LOCK.REQUEST.

Изгледи и таблица за преглед на Oracle enqueue и Oracle locks

V$session и v$session_wait

Когато сесията чака на опашка или заключване, това може да бъде сесия от V$session (в 11g и по-високи) и v$session_wait

Изберете * от v$session_wait, където събитие като ‘enq%’;Параметърът на събитието за изчакване на опашката   има следното значениеP1:тип на ресурса и желан режимP2:ID1 на ресурсаP3:ID2 на ресурса

Можем да използваме заявката по-долу, за да получим цялата опашка в системата

Изберете събитие,p1, p2,p3 от v$session_wait , където wait_time=0 и събитие като 'enq%';
  1. V$lock е друг полезен изглед за проверка на опашката
  2. V$lock изброява цялата структура на заключване, която в момента се съхранява в системата
  3. Типът на колоната ,id1 и id2 представляват типа ресурс  ,id1 и id2 на структурата на ресурсите. така че може да се присъедини към V$resource, който съдържа списъка на цялата структура на ресурсите
  • LMODE и заявката ни казват коя опашка (собственик, конвертор, сервитьори) е сесията
LMODE Искане Име на опашката
> 0 =0 Собственик
=0 > 0 Сервитьор
> 0    >  0 Конвертор

Заявката по-долу може да се използва за намиране на титуляр и сервитьор

SELECT inst_id,DECODE(заявка,0,'Притежател:','Waiter:')||sid sess,id1, id2, lmode, request, typeFROM V$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, type FROM V$LOCK WHERE заявка>0)ПОРЪЧАЙТЕ ПО id1, заявка;

В случай на RAC, заявката по-долу може да се използва за намиране на блокиращи и сервитьори

SELECT inst_id,DECODE(заявка,0,'Притежател:','Waiter:')||sid sess,id1, id2, lmode, request, typeFROM GV$LOCKWHERE (id1, id2, type) IN(SELECT id1 , id2, type FROM gV$LOCK WHERE заявка>0)ПОРЪЧКА ПО id1, заявка;

V$locked_object

това е друг полезен изглед за заключване на таблицата на Oracle

Той съдържа всички ключалки на TM в базата данни. Той дава слота за транзакция, процеса на ОС и идентификатора на сесията, която държи заключванията на TM

Има няколко изгледа, които могат да се използват за намиране на информация за ключалките. Тези изгледи са създадени от catblock.sql

DBA_LOCKS Показване на всички ключалки като v$lock
DBA_DML_LOCKS Показва всички DML™ заключвания, задържани или поискани
DBA_DDL_LOCKS Показва всички задържани или заявени DDL заключвания
DBA_WAITERS Показва всички сесии, които чакат, но не и задържат изчаквани за заключвания
DBA_BLOCKERS Показва сесии без изчакване, държащи ключалки, които се чакат

Запитване, за да разберете чакаща сесия и задържане на сесии в Oracle 

задайте linesize 1000column waiting_session heading 'WAITING|SESSION'column hold_session heading 'HOLDING|SESSION'column lock_type format a15column mode_held формат a15column mode_requested формат a15selection mode_requested формат a15selection_requested, a15selectsionrequested,15selectsionrequested,15selectsionrequested_,locked_select_session,locked_select_session_,locked_session_lock_, 

Запитване за откриване на всички заключени обекти

задайте термин на;задайте редове 130;колона sid_ser формат a12 заглавие 'сесия,|сериен#';формат потребителско име на колона a12 заглавие 'os потребител/|db потребител';колона процес формат a9 заглавие 'os|process';колона spid формат a7 заглавие 'trace|number'; колона owner_object формат a35 заглавие 'owner.object'; колона locked_mode формат a13 заглавие 'заключен|режим'; формат на състоянието на колоната a8 заглавие 'status';selectsubstr(to_char(l.session_id)| |','||to_char(s.serial#),1,12) sid_ser,substr(l.os_user_name||'/'||l.oracle_username,1,12) username,l.process,p.spid, substr(o.owner||'.'||o.object_name,1,35) owner_object,decode(l.locked_mode,1,'No Lock',2,'Row Share',3,'Row Exclusive',4 ,'Share',5,'Share Row Excl',6,'Exclusive',null) locked_mode,substr(s.status,1,8) statusfromv$locked_object l,all_objects     o,v$session       s,v$process p   където .object_id =o.object_idand l.session_id =s.sidand s.paddr      =p.addrand s.status !='KILLED'/

Как се обработват DML  заключванията в сървъра на Oracle

Когато актуализация, вмъкване, изтриване или избор за актуализация се изпълни в таблицата на Oracle, Oracle взема тези две ключалки

  • Заключване на DML таблица:За да се осигури последователност на дефиницията на обекта за продължителността на транзакцията. Това предотвратява извършването на всякакви DDL операции, докато DML е в ход.
  • Заключване на DML ред:Това е, за да се гарантира последователност на данните по време на изпълнението на транзакцията. Можем да префразираме като Това получава заключване на конкретния ред, който се докосва, и всяка друга транзакция, която се опитва да промени същия ред, се блокира, докато тази, която вече го притежава, приключи

Как се внедряват заключванията на таблицата на Oracle

Вече обяснихме инфраструктурата на Enqueue в предишния раздел. Ключалки за Oracle Table се изпълняват като TM Enqueue

Така че структурата на Enqueue би била

TM- -0

Режимите са

RS:споделяне на редове

RX:изключителен ред

S:споделяне

SRX:споделяне на ред изключително

X:изключителен

Всеки курсор поддържа списък със структура за заключване на таблицата, която се изгражда, докато анализира израза. При първото изпълнение се извършва извикване на функция, за да се заключи цялата таблица в списъка. Заключванията се освобождават, когато транзакцията се ангажира или връща обратно.

Възможността за връщане назад, особено връщане към точка на запис, добавя още едно измерение на сложност към заключването на речника. А именно, ако транзакция бъде върната назад отвъд точката, в която е била надстроена ключалката, тогава заключването трябва да бъде съответно понижено, като част от операцията за връщане назад, за да се намали рискът от изкуствени блокирания.

Изискванията за заключване на речника за транзакции и по-специално поддържането на хронология на преобразувания на заключване се осигуряват от DML заключвания във връзка с TM опашка. Всяка транзакция, съдържаща заключване на DML, притежава и заключване на TM enqueue. Основната функционалност за заключване се осигурява от опашката, а DML заключването добавя поддръжка на историята на преобразуването.

Фиксираният масив от структури за заключване на DML се оразмерява от параметъра DML_LOCKS. Неговият безплатен списък е защитен от ключалката за разпределяне на заключване на dml, а активните слотове се виждат във V$LOCKED_OBJECT.

За да зададете DML_LOCKs, проверете използването във v$resource_limit. Можем да го настроим щедро, тъй като заема много по-малко място

Как  да деактивирам заключването на таблицата?

  • DML заключванията и свързаните заключвания в опашката на TM могат да бъдат деактивирани изцяло или само за определени таблици.
  • За да деактивирате напълно тези заключвания, параметърът DML_LOCKS трябва да бъде настроен на нула. В база данни с паралелен сървър тя трябва да бъде настроена на нула във всички случаи.
  • За да деактивирате такива заключвания спрямо конкретна таблица, трябва да се използва клаузата DISABLE TABLE LOCKS на оператора ALTER TABLE.
  • Ако заключванията са деактивирани за таблица, тогава DML изразите все още могат да променят блоковете на таблицата, а заключванията на ниво ред все още се задържат. Въпреки това, заключванията на таблицата с подсподелен режим, които обикновено се свързват със заявки, и заключванията на таблицата с подизключителен режим, обикновено асоциирани с DML, не се приемат. Вместо това транзакциите срещу таблицата са защитени от конфликтни DDL, като просто се забраняват всички опити за заключване на цялата маса и по този начин всички DDL срещу таблицата.
  • Деактивирането на заключванията на таблицата може да повиши производителността, тъй като режийните разходи за придобиване на заключване са намалени   Това е по-важно в случай на RAC, където тези разходи са доста високи.
  • Деактивирането на заключванията на таблицата също предотвратява създаването на индекси на външни ключове. Като външен ключ трябва да се индексира, за да се избегне заключване на таблицата на дъщерната таблица, докато редовете се манипулират в родителската таблица. Така че, ако деактивираме заключването на таблицата заедно, индексите не са необходими
  • За предпочитане е да използвате alter table, за да деактивирате заключванията на таблицата на някаква таблица, след което да зададете на таблица dml_locks. Сякаш dml_locks е настроен на нула, ще трябва да отскочим екземпляра, за да го настроим отново
  • При вмъкване с директно зареждане сесията ще заеме опашката на TM в режим „X“. Това предотвратява извършването на друг DML, докато се извършва директното натоварване, в допълнение към блокирането на всички DDL.

Как се изпълняват заключванията на DML редове

Заключването на DML ред се изпълнява като комбинация от следните две неща

  1. Заключване на ниво ред:Реализира се като заключващ байт във всеки заглавка на ред и ITL (списък  на заинтересованите транзакции)  във всеки блок от данни или индекс. Те не се кешират никъде  и тъй като се съхраняват в самия блок , а не в SGA, който е ограничен, този механизъм на заключване от оракул е масово мащабируем.
  2. Заключване на транзакции:Те се изпълняват като TX Enqueue

Заключващият байт сочи към ITL записа в  блока, а Всички ITL записи за транзакцията сочат към TX Enqueue, което в крайна сметка определя дали транзакцията е завършена или е отменена. Сервитьорите ще изчакат заключване на транзакцията

Пример

  • Транзакция А иска да актуализира редове 2 и 3 в блока. Той ще разпредели ITL (списък на заинтересованите транзакции). Транзакцията осъществява достъп до ред 2 и 3 и вижда заключващия байт. Ако заключващият байт е  нула, той не е заключен. Транзакцията ще актуализира ред 3 ,3
  • Сега започва транзакция B   и тя иска да актуализира редовете 1. Той ще разпредели ITL (списък на заинтересованите транзакции). Транзакцията осъществява достъп до ред 1  и вижда заключващия байт. Ако заключващият байт е  нула, той не е заключен. Транзакцията ще актуализира ред 1
  • Сега транзакцията иска да актуализира ред 2. Ще има достъп до реда и ще го намери заключен, тъй като заключващият байт няма да е нула. Ще изглежда в ITL, който държи ключалката. Той ще извърши ITL почистване, за да разбере дали транзакцията е активна или неактивна. В този случай той ще намери транзакция А за активна. Така че транзакция B трябва да изчака транзакция A, за да се върне назад или да извърши ангажимент. Транзакцията B ще изчака при изискване на TX Enqueue, която транзакцията A държи в изключителен режим

Какво представлява списък с транзакции (ITL)

Когато дадена сесия иска да промени блок, тя трябва да разпредели ITL в блока. ITL е структурата от данни в заглавката на блока, която съдържа много слотове, които се заемат от транзакцията. Дефинира се от параметъра INITRANS и MAXTRANS при създаването на таблицата. Първоначалният брой слотове се създава според INITTRANS и те нарастват динамично до максимума на MAXTRANS

Какво е транзакция?

Когато сесията се актуализира /delete/insert , тогава се стартира транзакция. Той е завършен, когато се случи комит или връщане назад. Транзакцията се идентифицира чрез  идентификатор на транзакция (XID). Транзакцията идентифицира се състои от три части

  1. Отмяна или отмяна на сегментен номер
  2. Номер на слота на таблицата с транзакции
  3. Последователност или обвивка №

XID=usn#.slot#.wrap#

Всеки ITL блок ще съдържа XID

Изчистването на ITL означава да търсите XID в ITL и да търсите сегментите за връщане на базата на това и да търсите таблицата на транзакциите и номера на обвивка, за да проверите за активността на транзакцията.

Можем да използваме командата по-долу, за да изхвърлим всеки сегмент за връщане назад

Променете заглавката за отмяна на системния дъмп <име на сегмент за отмяна>;

Всяка активна транзакция може да се види в таблицата на v$transaction

изберете addr, xidusn, xidslot, xidsqn от v$transaction;ADDR         XIDUSN    XIDSLOT     XIDSQN-------- ---------- ---------- --- -------3C485875         50         5      3000

Идентификаторът на транзакцията (XID) може също да бъде получен в собствената сесия с помощта на

изберете dbms_transaction.local_transaction_id от двоен;

Чакането на TX enq ще се види във v$session_wait

P1:Име|режим

P2:rbs3|обвивка#

P3:слот#

За да обобщим заключванията на DML ред

Първият DML в сесия, в която транзакция все още не съществува, имплицитно ще създаде транзакция.

  • Ще бъдат присвоени номер на сегмент за отмяна, слот и обвивка
  • Текстовата опашка ще бъде създадена

Когато бъде идентифициран ред, който трябва да се промени, сесията ще вземе запис в ITL на блока от данни, ще го присвои на транзакцията

  • USN/SLOT/WRAP ще бъдат записани в слота ITL, запазвайки този слот за текущата транзакция
  • Заключването ще бъде взето на реда, като зададете заключващия байт в директорията на редовете да сочи към слота ITL на текущата транзакция

И TM, и TX Enqueue могат да се видят във V$lock

  • Типът идентифицира TM или TX
  • ID1 и ID2 може да носят допълнителна информация, но са контекстно-чувствителни по отношение на опашката TYPE
  • За TM enqueue, ID1 е OBJECT_ID на обекта, който се заключва, който може да бъде препратен в DBA_OBJECTS, а ID2 винаги е 0
  • За TX Enqueue, ID1 и ID2 задържат номера на сегмента за отмяна, номера на слота и обвиването.

Подробен пример за обяснение на работата на ключалките на Oracle

  • Създайте фиктивната таблица
Създайте таблица от j като изберете * от dba_objects, където rownum <3;Таблица е създадена Създайте таблица от j1 като изберете * от dba_objects, където rownum <3;Таблица е създадена
  • Сесия А
Изберете * от j за актуализиране;

Нека видим какво присъства във v$lock

SQL> изберете отделен sid от v$mystat; SID---------2125SQL> изберете * от v$lock, където sid=2125;ADDR             KADDR                  SID TY        ID1        ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- ----- Заявка Ctime Block ---------- ---------- ---------- 00000006B5D9D0D0 00000006B5D9D148 2125 TX 2883613 16425600 60 44 0FFFFFFFF7DA4B360 FFFFFFF7DA4B3C0 2125 TM 21488781          0          30         44          0

Така че  виждаме тук

Заключването на таблицата на DML Oracle е създадено

TX (заключване на транзакцията) е създаден

  • Да започнем сесия Б
SQL>Изберете * от j1 за актуализиране;SQL> изберете отделен sid от v$mystat; SID---------2302SQL> изберете * от v$lock, където sid=2302;ADDR             KADDR                  SID TY        ID1        ID2      LMODE---------------- --- ------------- ---------- -- ---------- ---------- ----- ----- Заявка CTMITE блок ---------- ---------- ---------- 00000006AF7FF910 00000006AF7FF988 2302 TX 2949148 16884039 60 10 0FFFFFFF7DA4B360 FFFFFFF7DA4B3C0 2302 33544 0 30 10 000000006DC289D60 00000006DC289DB8 2302 AE 15062272 0 40 106 0 

Така че  виждаме тук

Заключването на DML таблицата е създадено

TX (заключване на транзакцията) е създаден

Сега нека  се опитаме да направим

Изберете * от j за актуализиране;

Това ще увисне

  • Нека започнем друга сесия, за да анализираме проблема

Ако  виждате подробности за сесията sid =2032 във V$lock

изберете * от v$lock, където sid=2302;ADDR             KADDR                  SID TY        ID1        ID2      LMODE---------------- ------------- --- ---------- -- ---------- ---------- ---------- ЗАЯВКА      CTIME      БЛОКИРАНЕ-- --------- ----------- ---------- FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0 2302 TM 33544 0 30 47 000000006DC289D60 00000006DC289DB8 2302 AE 15062272 2302 TX    2883613   16425600          0          6          7          0 FFFFFFFF7DA4B360 FFFFFFFF7DA4B3C0       2302 TM   21488781          0          30          7          0

Удебеленият ред е заявка 6 (изключително заключване) на някои TX enq

Сега можем да използваме заявката по-долу, за да намерим блокиращата сесия

изберете l1.sid, ' БЛОКИРА ', l2.sid от v$lock l1, v$lock l2, където l1.block =1 и l2.request> 0 и l1.id1=l2.id1 и l1.id2=l2.id2SID 'ISBLOCKING'         SID---------- ------------- ----------2125  БЛОКИРА        2302

Сега можем да ангажираме или връщаме сесията 2125, за да продължи транзакцията B. Можем да прекратим  сесия 2125 с помощта на командата по-долу и за освобождаване на ключалката

Промяна на сесията за унищожаване на системата ‘2125,’;

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

TX заключванията във v$lock не казват на информацията за реда къде е налице конкуренцията. Можем да видим тези неща с помощта на заявките

Заявката по-долу трябва да бъде изпълнена от сесията, която  изчаква

SQL> изберете row_wait_obj#, row_wait_file#, row_wait_block#, row_wait_row#от v$session където sid=2302ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_---------------------- --------- --------------- ------------21488781            461           81063             0 изберете do.object_name,row_wait_obj#, row_wait_file #, row_wait_block#, row_wait_row#,dbms_rowid.rowid_create ( 1, ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW# )от v$session s, dba_objects dowhere =23CT_2_WID s_ и dowhere. OBJECT_NAME ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW# DBMS_ROWID.ROWID_C------------ -------------- ----------- ------------- ------------------J21488781            461           81063             0 ABR+SNAHNAAATynAAA SQL> Изберете * от j, където rowid =' ABR+SNAHNAAATynAAA';

Сродни статии

Как работи заключването на Oracle
Как да намерите подробности за сесията в базата данни на Oracle
Важна проверка на състоянието на базата данни
Въпроси за интервю за приложения на oracle dba
запитвания за проверка на заключванията в базата данни на oracle
oracle dba въпроси за интервю

Препоръчани  курсове

Следват някои от препоръчаните курсове, които можете да закупите, ако искате да стигнете още една стъпка напред

По-долу са дадени връзките към някои от курсовете


Oracle DBA 11g/12c – Администриране на база данни за Junior DBA :Този курс е добър за хората, които започват като Junior DBA или се стремят да бъдат DBA на Oracle. Това ще осигури добро разбиране на задачите за архивиране и възстановяване и общите административни задачи
База данни на Oracle:Oracle 12C R2 RAC Administration :Този курс обхваща инсталирането, администрирането на Oracle RAC. Добър курс за Oracle DBA, които искат да надградят уменията си за Oracle RAC
Oracle Data Guard:Администриране на база данни за Oracle 12C R2 :Този курс обхваща инсталирането, администрирането на Oracle Dataguard. Добър курс за Oracle DBA, които искат да надградят уменията си за Oracle Dataguard


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Какво означава %Type в Oracle sql?

  2. GWFG в Oracle RAC

  3. Изтрийте с ляво присъединяване в Oracle 10g

  4. Как работи извличането на данни от SQL Server към SqlDataReader?

  5. Премахнете заглавката на колона в изходния текстов файл