Коли запис заблокований в Oracle, чи можемо ми знати, який запис заблокований?


10

Коли запис заблокований, чи можемо ми знати, який із них заблокований?

Як я можу отримати запису із різким записом чи іншу інформацію?


Я можу отримати інформацію на цьому sql

SELECT c.ROW_WAIT_OBJ#,c.ROW_WAIT_FILE#,c.ROW_WAIT_BLOCK#,c.ROW_WAIT_ROW#
   FROM v$locked_object a, dba_objects b, v$session c    
WHERE a.object_id = b.object_id    
    AND a.SESSION_ID = c.sid(+) 

Я знайшов метод в Інтернеті, щоб отримати ряд із використанням функції DBMS_ROWID.ROWID_CREATE()

Але це, здається, не працює.


2
Ви можете бачити лише блокування, на які чекає якийсь процес, а не ті, які утримуються транзакцією.
a_horse_with_no_name

@a_horse_with_no_name - v $ lock показує вам блокування транзакції
Кріс Саксон

@ChrisSaxon: Ви праві. Я мав на увазі той факт, що ви не бачите, які рядки були заблоковані - я мав би бути більш чітким.
a_horse_with_no_name

Oracle (навпаки інших баз даних) не має спільної структури для блокувань. Це робить базу даних масштабованою, але, з іншого боку, ви не можете бачити всі блокування. Замки зберігаються безпосередньо в блоках баз даних. У той момент, коли когось блокують, створюється структура "власник-офіціант". Тоді ви побачите цю пару в V$LOCK.
ibre5041

Відповіді:


13

Ви не можете перелічити всі рядки, які блокуються сеансом. Однак, коли сеанс заблокується іншим, ви можете виявити, який сеанс / рядок блокує його.

Oracle не підтримує список окремих блокувань рядків. Швидше замки реєструються безпосередньо всередині самих рядків - подумайте про це як додатковий стовпчик.

Ви можете дізнатися, який сеанс придбав блокування об'єкта за допомогою V$LOCKперегляду, але це буде лише загальна інформація, а не на рівні рядків.

За допомогою цього перегляду ви також можете дізнатися, чи блокується сеанс іншим. У цьому випадку, якщо сеанс блокується іншим сеансом, інформація про рядки відображається в V$SESSIONінформації.

Ви можете отримати rowid, давайте побудуємо приклад з 2-х сеансів:

SESSION1> create table test as select * from all_objects;

Table created

SESSION1> select rowid from test where object_name = 'TEST' for update;

ROWID
------------------
AAMnFEAAaAAALTDAAz

/* setting identifiers to help with identifying this session later */
SESSION2> exec dbms_application_info.set_client_info('012345');

PL/SQL procedure successfully completed

SESSION2> select 1 from test where object_name = 'TEST' for update;
/*  this will block */

Сесія 2 тепер чекає на сесію 1. Ми можемо виявити блокування рядка за допомогою:

SESSION1> SELECT o.object_name,
       2         dbms_rowid.ROWID_CREATE (1,
       3                                  s.ROW_WAIT_OBJ#,
       4                                  s.ROW_WAIT_FILE#,
       5                                  s.ROW_WAIT_BLOCK#,
       6                                  s.ROW_WAIT_ROW#) rid
       7     FROM dba_objects o, v$session s
       8    WHERE o.object_id = s.row_wait_obj#
       9      AND s.client_info = '012345';

OBJECT_NAME     RID
--------------- ------------------
TEST            AAMnFEAAaAAALTDAAz

Для подальшого читання: опис процесу Тома Кейта .


3

Ви можете знайти всі замки таблиць у базі даних Oracle, виконавши наступний запит

select
   c.owner,
   c.object_name,
   c.object_type,
   b.sid,
   b.serial#,
   b.status,
   b.osuser,
   b.machine
from
   v$locked_object a ,
   v$session b,
   dba_objects c
where
   b.sid = a.session_id
and
   a.object_id = c.object_id;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.