Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Кто заблокировал строку, которая мне нужна ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Здравствуйте.

Есть сеанс "А", которому нужна строка таблицы с неким значением PK. Но строка эта была ранее заблокирована сеансом "Б".
Может ли сеанс "А", выполняющий select ... from ... for update nowait, получить при обломе информацию о том, что его строку держит именно сеанс "Б" ?

Прочитал тут, воспроизвёл всё на учебной схеме HR:
+
-- окно "1":
SQL> conn sys@xe/***** as sysdba
Connected.
SQL> grant select on dba_dml_locks to hr;

Grant succeeded.
SQL> disc
Disconnected from Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> conn hr@xe/hr
Connected.

SQL> create table td(dummy char(1));

Table created.

SQL> insert into tdd values(null);

1 row created.

SQL> commit;

Commit complete.

SQL> select SYS_CONTEXT('USERENV','SID') from dual;

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

37

SQL> update td set dummy='Y';

1 row updated.

SQL> select name, mode_held from sys.dba_dml_locks where session_id=sys_context('userenv','sid');

NAME                           MODE_HELD
------------------------------ -------------
TD                             Row-X (SX)
-- осно "2":
SQL> conn hr@xe/hr
Connected.
SQL> select sys_context('userenv','sid') from td;

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

35

SQL> update td set dummy='Z'; -- висяк

-- осно "1":
SQL> select ROW_WAIT_OBJ#, ROW_WAIT_FILE#, ROW_WAIT_BLOCK#, ROW_WAIT_ROW#, BLOCKING_SESSION who from v$session where sid=35;

ROW_WAIT_OBJ# ROW_WAIT_FILE# ROW_WAIT_BLOCK# ROW_WAIT_ROW#        WHO
------------- -------------- --------------- ------------- ----------
        18056              4           10351             0         37

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

DBMS_ROWID.ROWID_OBJECT(ROWID) ROWID
------------------------------ ------------------
                         18056 AAAEaIAAEAAAChvAAA

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

no rows selected

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

SESSION_ID MODE_HELD
---------- -------------
        37 Row-X (SX)
        35 Row-X (SX)

Но в этом скрипте ситуация другая: сеанс "1" блокирует первым, сеанс "2" пытается заблокировать и зависает в ожидании, после чего мы переключаемся снова в "1" и смотрим, кто из-за нас "страдает". А надо наоборот: найти того, из-за кого мы "страдаем" :-)
Может ли коннект избежать зависания и САМ определить, кто ему мешает заблокировать строку ? Если да, то делается ли это через какие-то поставляемые пакеты или самому изобретать велосипед ?
18 авг 11, 08:54    [11137033]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
select for update nowait... если строка заблокировано получищ ошибку ORA-54.
18 авг 11, 09:11    [11137066]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Elic
Member

Откуда:
Сообщений: 29978
Кентурион Крысобой
или самому изобретать велосипед ?
Не трать время, велосипед всё равно не поедет.
18 авг 11, 09:12    [11137069]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
штырлиц
Guest
Ramin
select for update nowait... если строка заблокировано получищ ошибку ORA-54.

вопрос то читаешь перед тем как писать?
18 авг 11, 09:13    [11137071]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Elic
Кентурион Крысобой
или самому изобретать велосипед ?
Не трать время, велосипед всё равно не поедет.
я и не хочу его тратить, потому и спрашиваю: без велосипеда эту информацию вытащить можно или нет ?
18 авг 11, 09:17    [11137081]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
штырлиц
Ramin
select for update nowait... если строка заблокировано получищ ошибку ORA-54.

вопрос то читаешь перед тем как писать?

да ... а ты сам то читал вопрос?!

кроме вопроса:
автор
Может ли сеанс "А", выполняющий select ... from ... for update nowait, получить при обломе информацию о том, что его строку держит именно сеанс "Б" ?
остальные вопросы не логичные...
18 авг 11, 09:18    [11137086]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Ramin
select for update nowait... если строка заблокировано получищ ошибку ORA-54.
это понятно; как дальше понять, кто именно держит нужную мне строку ?
18 авг 11, 09:20    [11137093]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
cmddd
Guest
Кентурион Крысобой
Ramin
select for update nowait... если строка заблокировано получищ ошибку ORA-54.
это понятно; как дальше понять, кто именно держит нужную мне строку ?


поспрашивай ребят, может кто-нибудь сознается
18 авг 11, 09:26    [11137133]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Кентурион Крысобой,

Для начала понятно, что после отлупа он уже может и не держать, а может уже и не он?

Для того, чтобы дать уверенный ответ про блокировку ее надо захватить, а это и не удалось.

Есть конечно велосипед с третьей сессией, которая в фоне будет мониторить состояние захватывающей и если та зависла информировать клиента.
18 авг 11, 09:27    [11137145]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Кентурион Крысобой
Member

Откуда:
Сообщений: 202
Сергей Арсеньев
Кентурион Крысобой,

Для начала понятно, что после отлупа он уже может и не держать, а может уже и не он?

Для того, чтобы дать уверенный ответ про блокировку ее надо захватить, а это и не удалось.
Когда коннект ставит блокировку на строку - пишется ли куда-нить инфа по этому коннекту ? не просто в самой строке типа "она занята", а именно кем занята - вот эта инфа где-то есть или нет ?
Сергей Арсеньев
Есть конечно велосипед с третьей сессией, которая в фоне будет мониторить состояние захватывающей и если та зависла информировать клиента.
Да, про этот вариант я уразумел в том же топике. Но хотелось бы малой кровью обойтись, без "фонового мониторинга".
18 авг 11, 09:33    [11137174]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
ALocky
Member

Откуда: Понаехал из Подмосковья
Сообщений: 747
Кентурион Крысобой,

Вот тут товарищи с галерки тебе подсказывают:
pravednik
Чтобы знать, заблокирована ли строка, нужно попытаться наложить на нее лок. Без этого информации о блокировках нет. То есть или создавать параллельную сессию, будет выполнять "попытки лока", или смотреть на стороне блокировщика.
18 авг 11, 09:37    [11137202]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Кентурион Крысобой
занята - вот эта инфа где-то есть или нет ?

Естественно есть. Например построчные в дампе блока. Но этот велосипед будет такой сложности, что ...
18 авг 11, 09:40    [11137224]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Кентурион Крысобой
?
How to know which row is locked by what user. (Doc ID 132629.1)
18 авг 11, 11:27    [11138200]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Valergrad
Member

Откуда:
Сообщений: 703
Хотел почитать, но нужен support/contract number. А можно выложить документ в открытый доступ?
18 авг 11, 14:50    [11139947]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
dbms_photoshop
Member

Откуда: sqlmdx.net
Сообщений: 5151
Valergrad
Хотел почитать, но нужен support/contract number. А можно выложить документ в открытый доступ?
Это запрещенный приём.
Но братья французы готовы прийти тебе на помощь!
18 авг 11, 15:08    [11140100]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
бамс
Guest
dbms_photoshop
Но братья французы готовы прийти тебе на помощь!

Это ж сколько ждать придется на мало-мальски большой табличке. По каждой строке пройтись, попытаться ее заблокировать... Думаю, результаты в большинстве случаев уже не понадобятся после завершения.
18 авг 11, 15:17    [11140186]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
select /*+ ordered */
 bs.sid, bs.serial# Serial, hk.ctime,
 bs.username||'\'|| bs.osuser||'\'||bs.machine blocker,
 bs.status, bs.sql_hash_value sql_hash, bs.prev_hash_value Prev_Sql_hash,
 bs.program, bs.module, bs.action, bs.client_info,
 TO_CHAR(bs.logon_time,'hh:mi:ss dd.mm.yyyy') logon_time, hk.type, case hk.type
   when 'TM' then (select ob.owner || '.' || ob.object_name
                   from dba_objects ob where ob.object_id= hk.id1)
   when 'TX' then (select ob.owner || '.' || ob.object_name ||' / '||
                   dbms_rowid.rowid_create(1, ob.data_object_id,
                   ws.row_wait_file#, ws.row_wait_block#, ws.row_wait_row#)
                   from dba_objects ob where ob.object_id(+)=ws.row_wait_obj#)
 end obj_rowid
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.block   = 1 AND  wk.request  != 0  AND  wk.TYPE (+) = hk.TYPE
  AND  wk.id1  (+) = hk.id1  AND  wk.id2  (+) = hk.id2
  AND  hk.sid    = bs.sid(+)  AND  wk.sid    = ws.sid(+)
  and  bs.lockwait is null ORDER BY hk.ctime desc;
18 авг 11, 15:20    [11140221]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Flok
Member

Откуда:
Сообщений: 258
pravednik,
вы результат-то проверяли?

Автор, могу предложить тебе следующее - не знаю, поможет ли тебе это. Запросик, выдающий список сеансов, которые имеют или стоят в очередь на блокировку на ту же таблицу, строка которой тебе нужна.

Вот:
18 авг 11, 16:22    [11140813]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Flok
Member

Откуда:
Сообщений: 258
Flok
pravednik,
вы результат-то проверяли?

Автор, могу предложить тебе следующее - не знаю, поможет ли тебе это. Запросик, выдающий список сеансов, которые имеют или стоят в очередь на блокировку на ту же таблицу, строка которой тебе нужна.

Вот:


select s.terminal,OS_USER_NAME,SESSION_ID,OS_USER_NAME,lo.oracle_username,obj.owner,obj.object_name 
   from v$locked_object lo,all_objects obj,  v$session s
   where lo.object_id=obj.object_id and  lo.session_id=s.sid
   and object_name = '&TABLE'
18 авг 11, 16:28    [11140874]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
asher_akerman
Member [заблокирован]

Откуда:
Сообщений: 4050
Flok
Flok
pravednik,
вы результат-то проверяли?

Автор, могу предложить тебе следующее - не знаю, поможет ли тебе это. Запросик, выдающий список сеансов, которые имеют или стоят в очередь на блокировку на ту же таблицу, строка которой тебе нужна.

Вот:


select s.terminal,OS_USER_NAME,SESSION_ID,OS_USER_NAME,lo.oracle_username,obj.owner,obj.object_name 
   from v$locked_object lo,all_objects obj,  v$session s
   where lo.object_id=obj.object_id and  lo.session_id=s.sid
   and object_name = '&TABLE'
Просто офигенная помощь. Особенно если в таблице пара миллионов строк и обновляют в ней данные 10 раз/сек.
18 авг 11, 16:33    [11140927]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
Flok
pravednik,
вы результат-то проверяли?

--сессия 1

create table t as select level x from dual connect by level<=5
SQL> /

Table created.

SQL> update t set x=0 where x=1;

1 row updated.

SQL>

--сессия 2

SQL> select * from t for update;

--####висим

--сессия 3

 1  select /*+ ordered */
  2   bs.sid, bs.serial# Serial,
  3   --hk.ctime,
  4   bs.username||'\'|| bs.osuser||'\'||bs.machine blocker,
  5   /*bs.status, bs.sql_hash_value sql_hash, bs.prev_hash_value Prev_Sql_hash,
  6   bs.program, bs.module, bs.action, bs.client_info,
  7   TO_CHAR(bs.logon_time,'hh:mi:ss dd.mm.yyyy') logon_time, hk.type,*/
  8   case hk.type
  9     when 'TM' then (select ob.owner || '.' || ob.object_name
 10                     from dba_objects ob where ob.object_id= hk.id1)
 11     when 'TX' then (select ob.owner || '.' || ob.object_name ||' / '||
 12                     dbms_rowid.rowid_create(1, ob.data_object_id,
 13                     ws.row_wait_file#, ws.row_wait_block#, ws.row_wait_row#)
 14                     from dba_objects ob where ob.object_id(+)=ws.row_wait_obj#)
 15   end obj_rowid
 16  FROM v$lock hk, v$session bs, v$lock wk, v$session ws
 17  WHERE hk.block   = 1 AND  wk.request  != 0  AND  wk.TYPE (+) = hk.TYPE
 18    AND  wk.id1  (+) = hk.id1  AND  wk.id2  (+) = hk.id2
 19    AND  hk.sid    = bs.sid(+)  AND  wk.sid    = ws.sid(+)
 20*   and  bs.lockwait is null ORDER BY hk.ctime desc
SQL> /

       SID     SERIAL BLOCKER              OBJ_ROWID
---------- ---------- -------------------- ----------------------------------------
       138      49431 SYS\oracle\xxx   SYS.T / AAARVxAABAAAMRSAAA

SQL> select * from t where rowid='AAARVxAABAAAMRSAAA';

         X
----------
         1

SQL>
18 авг 11, 16:38    [11140969]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
Flok
Member

Откуда:
Сообщений: 258
pravednik,

вы выводите rowid первой строки, которая стоит в очереди на блокировку!
а если бы второй сессии не было бы, то ваш запрос ничего бы не выдал!
18 авг 11, 16:48    [11141055]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
pravednik
Member

Откуда: Jacksonville, FL
Сообщений: 16268
Flok
pravednik,

вы выводите rowid первой строки, которая стоит в очереди на блокировку!
а если бы второй сессии не было бы, то ваш запрос ничего бы не выдал!

Дык понятно, что не выдал бы.
Я предполагал, что первый ответ Элика дал понять, что изначальные стремления автора ошибочны. Я "с галерки" тоже об этом сказал(11137202) .
Поэтому подмал, что все в итоге свелось в принципе к "поиску блокировщика моей строки"
18 авг 11, 16:53    [11141086]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6718
Flok,
Кентурион Крысобой
Есть сеанс "А", которому нужна строка таблицы с неким значением PK. Но строка эта была ранее заблокирована сеансом "Б".
18 авг 11, 16:56    [11141113]     Ответить | Цитировать Сообщить модератору
 Re: Кто заблокировал строку, которая мне нужна ?  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6718
Flok
а если бы второй сессии не было бы

То и вопросов у ТС не было бы
18 авг 11, 16:57    [11141119]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить