Как найти кто заблокировал запись в таблице?

в лок
Дата: 18.03.2011 17:45:46
WWWeb
в лок,

конкретная запись известна



Поэтому я говорю, наложите на эту же запись блокировку в другой сессии, в sqlplus например, предварительно узнав SID этой сессии.

Потом в v$lock смотрите свою сессию, определите какой у неё id1, id2, type и ищите в v$lock другую строчку с такими же значениями этих столбцов, у которой BLOCK=1.
Соответственно эта сессия и заблокировала.
-2-
Дата: 18.03.2011 17:46:52
в лок
Если неизвестна конкретная запись, значит придётся блокировать всю таблицу.
Чтобы зачем придется?
в лок
Дата: 18.03.2011 17:48:03
-2-
в лок
Если неизвестна конкретная запись, значит придётся блокировать всю таблицу.
Чтобы зачем придется?


хватит тупить :)
-2-
Дата: 18.03.2011 18:10:15
в лок
хватит тупить :)
SQL> select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
313

SQL> update dual set dummy='Y';

1 row updated.
--Есть ли заблокированные таблицы?
SQL> select name, mode_held from dba_dml_locks where session_id=sys_context('userenv','sid');

NAME            MODE_HELD
--------------- ---------------
DUAL            Row-X (SX)

 switch to B
B> select sys_context('userenv','sid') from dual;

SYS_CONTEXT('USERENV','SID')
--------------------------------------------------------------------------------
356

B> update dual set dummy='Z';

 switch back
--Какая строка заблокирована и кем?
SQL> select ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#, FINAL_BLOCKING_SESSION who from v$session where sid=356;

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#        WHO
------------- -------------- --------------- ------------- ----------
          116              1             473             0        313

SQL> select dbms_rowid.rowid_object(rowid), rowid from dual;

DBMS_ROWID.ROWID_OBJECT(ROWID) ROWID
------------------------------ ------------------
                           116 AAAAB0AABAAAAHZAAA

SQL> select session_id, mode_held from dba_dml_locks where (owner,name)=(('SYS','DUAL'));

SESSION_ID MODE_HELD
---------- ---------------
       356 Row-X (SX)
       313 Row-X (SX)
в лок
Дата: 18.03.2011 18:29:41
Так же в другой сессии заблокирован ресурс, который приводит к enqueue.

Чего вы хотели доказать непонятно.
-2-
Дата: 18.03.2011 18:55:35
в лок
Чего вы хотели доказать непонятно.
Не понял, зачем пытаться блокировать всю таблицу, чтобы узнать кто в ней держит локи.
Если же нужно узнать конкретную строку, то V$LOCK тут, в общем случае, не поможет. Предложил более адекватный способ определения кто блокирует конкретную строку, когда есть ее ожидание.
Деев И.
Дата: 18.03.2011 19:26:26
WWWeb
Здравствуйте.
Как получить номер сессии того кто заблокировал в таблице запись?


Спасибо.


Можно такими скриптами:


-----------------------------------------------------------------------------------------
-- кто кого блокирует
-----------------------------------------------------------------------------------------
select 'Сессия с sid '||a.sid||' блокирует сессию с sid '||b.sid 
  from v$lock a, v$lock b
where a.BLOCK = 1 
  and b.REQUEST > 0 
  and a.ID1 = b.ID1
  and a.ID2 = b.ID2;

-----------------------------------------------------------------------------------------
-- определение того, кто мешает заданной сессии, какой объект заблокирован и какая строка
-----------------------------------------------------------------------------------------
select s.sid locked_session,
  s.blocking_session 
, uo.object_name locked_object
, dbms_rowid.rowid_create(1,row_wait_obj#,row_wait_file# ,row_wait_block#,row_wait_row#) locked_obj_rowid
, (case command when 2 then 'INSERT' when 3 then 'SELECT' when 6 then 'UPDATE' when 7 then 'DELETE' when 26 then 'LOCK' 
 else to_char(command)||' - см. v$session desc, таблица 7.5 , 10g Database Reference' end) command
  from v$session s
     , dba_objects uo
 where uo.object_id = s.row_wait_obj#
   and s.SID = &problem_sess; -- SID заблокированной сессии

WWWeb
Дата: 19.03.2011 13:00:11
Всем спасибо, с проблемой разобрался
Tolka
Дата: 22.03.2011 18:10:10
Деев И.,

я тут момент один заметил
+

-- session 1
some_user@db: select sid, serial# from gv$session where username = 'SOME_USER';

       SID    SERIAL#
---------- ----------
        96       5259

some_user@db: select * from t;

        ID NAME
---------- ------------------------------
         1 asdf
         2 qwer

some_user@db: update t set name = 'uiop' where id = 2;

1 row updated.

-- session 2
some_user@db: select sid, serial#, logon_time from gv$session where username = 'SOME_USER' order by logon_time desc;

       SID    SERIAL# LOGON_TIME
---------- ---------- -------------------
       302       1337 22.03.2011 16:30:57
        96       5259 22.03.2011 16:29:28

some_user@db: update t set name = 'bnm,' where id = 2;

waiting...

-- session 1
column locked_object format a10
column command format a20

SELECT s.sid               AS locked_session
      ,s.blocking_session  AS blocking_session
      ,o.object_name       AS locked_object
      ,dbms_rowid.rowid_create(1,
                               row_wait_obj#,
                               row_wait_file#,
                               row_wait_block#,
                               row_wait_row#) 
                           AS locked_obj_rowid
      ,CASE command
          WHEN 2 THEN 'INSERT'
          WHEN 3 THEN 'SELECT'
          WHEN 6 THEN 'UPDATE'
          WHEN 7 THEN 'DELETE'
          WHEN 26 THEN 'LOCK'
          ELSE to_char(command) || ' - см. v$session desc, таблица 7.5 , 10g Database Reference'
      END                  AS command
  FROM gv$session s
  JOIN dba_objects o ON o.object_id = s.row_wait_obj#
 WHERE s.sid = 302; 


LOCKED_SESSION BLOCKING_SESSION LOCKED_OBJ LOCKED_OBJ_ROWID   COMMAND
-------------- ---------------- ---------- ------------------ --------------------
           302               96 T          AAA7qvAAJAALqnvAAB UPDATE


some_user@db: select rowid, t.* from t;

ROWID                      ID NAME
------------------ ---------- ------------------------------
AAA8BzAAJAALqnvAAA          1 asdf
AAA8BzAAJAALqnvAAB          2 uiop

AAA7qvAAJAALqnvAAB != AAA8BzAAJAALqnvAAB

Сгенерированый вами ROWID ссылается на OBJECT_ID, в то время как псевдоколонка ROWID ссылается на DATA_OBJECT_ID

-- сгенерированный
some_user@db: select dbms_rowid.rowid_object('AAA7qvAAJAALqnvAAB') from dual;

DBMS_ROWID.ROWID_OBJECT('AAA7QVAAJAALQNVAAB')
---------------------------------------------
                                       244399

-- псевдоколонка ROWID
some_user@db: select dbms_rowid.rowid_object('AAA8BzAAJAALqnvAAB') from dual;

DBMS_ROWID.ROWID_OBJECT('AAA8BZAAJAALQNVAAB')
---------------------------------------------
                                       245875


some_user@db: select object_id, data_object_id from user_objects where object_name = 'T';

 OBJECT_ID DATA_OBJECT_ID
---------- --------------
    244399         245875


Tolka
Дата: 22.03.2011 18:48:29
Т.е. чтобы он соответствовал значению возвращаемому псевдоколонкой ROWID нужно в dbms_rowid.rowid_create передавать o.data_object_id вместо s.row_wait_obj#

+ o.data_object_id вместо s.row_wait_obj#

some_user@db: SELECT s.sid               AS locked_session
  2        ,s.blocking_session  AS blocking_session
  3        ,o.object_name       AS locked_object
  4        ,dbms_rowid.rowid_create(1,
  5                                 o.data_object_id,
  6                                 row_wait_file#,
  7                                 row_wait_block#,
  8                                 row_wait_row#)
  9                             AS locked_obj_rowid
 10        ,CASE command
 11            WHEN 2 THEN 'INSERT'
 12            WHEN 3 THEN 'SELECT'
 13            WHEN 6 THEN 'UPDATE'
 14            WHEN 7 THEN 'DELETE'
 15            WHEN 26 THEN 'LOCK'
 16            ELSE to_char(command) || ' - см. v$session desc, таблица 7.5 , 10g Database Reference'
 17        END                  AS command
 18    FROM gv$session s
 19    JOIN dba_objects o ON o.object_id = s.row_wait_obj#
 20   WHERE s.sid = 267;

LOCKED_SESSION BLOCKING_SESSION LOCKED_OBJ LOCKED_OBJ_ROWID   COMMAND
-------------- ---------------- ---------- ------------------ --------------------
           267               96 T          AAA8BzAAJAALqnvAAB UPDATE

some_user@db: select rowid, t.* from t;

ROWID                      ID NAME
------------------ ---------- ------------------------------
AAA8BzAAJAALqnvAAA          1 asdf
AAA8BzAAJAALqnvAAB          2 uiop

some_user@db: select * from t where rowid = 'AAA8BzAAJAALqnvAAB';

        ID NAME
---------- ------------------------------
         2 uiop