Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
Возникает дедлок, Lock table никто не говорит, индексы на FK есть все. Не могу понять, как такое получается.

Oracle8i Enterprise Edition Release 8.1.7.4.0 - 64bit Production
With the Partitioning option
JServer Release 8.1.7.4.0 - 64bit Production


---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00050023-000190bf 9 72 X 37 62 X
TM-000053b8-00000000 37 62 SSX 9 72 SS SX
session 72: DID 0001-0009-00001372 session 62: DID 0001-0025-00000002
session 62: DID 0001-0025-00000002 session 72: DID 0001-0009-00001372
Rows waited on:
Session 62: obj - rowid = 000053B8 - AAAFO4AAYAAAyZkAAg
Session 72: no row

Как понять, что за ресурс TX-00050023-000190bf ?
29 июн 06, 06:25    [2823683]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
А Вам не хватит указанного rowid?
Serge Stepanov
Session 62: obj - rowid = 000053B8 - AAAFO4AAYAAAyZkAAg
29 июн 06, 06:27    [2823685]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
Что такое 000053B8 - AAAFO4AAYAAAyZkAAg - я знаю.
Дедлок возникает при попытке апдейтить строку с rowid AAAFO4AAYAAAyZkAAg из предварительно заблокированной таблицы в SSX режиме. Я не могу понять каким образом происходит блокировка таблицы, поэтому и хочу найти какие еще ресурсы лочит процесс, что бы потом по коду найти это.
29 июн 06, 09:30    [2823906]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
SeaGate
Member

Откуда: Новосибирск
Сообщений: 1635
Serge Stepanov
Что такое 000053B8 - AAAFO4AAYAAAyZkAAg - я знаю.
Дедлок возникает при попытке апдейтить строку с rowid AAAFO4AAYAAAyZkAAg из предварительно заблокированной таблицы в SSX режиме. Я не могу понять каким образом происходит блокировка таблицы, поэтому и хочу найти какие еще ресурсы лочит процесс, что бы потом по коду найти это.

Тут немного инфы есть
29 июн 06, 13:13    [2825311]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
Ага, прочитал, спасибо. Теперь понятно, что не узнаю сейчас имя ресурса. Буду смотреть еще Log Miner'ом, что бы разобрать что же происходить. Но на самом деле тот еще вопрос - как же все таки такая блокировка получилась...
29 июн 06, 13:49    [2825591]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Serge Stepanov
Ага, прочитал, спасибо. Теперь понятно, что не узнаю сейчас имя ресурса. Буду смотреть еще Log Miner'ом, что бы разобрать что же происходить. Но на самом деле тот еще вопрос - как же все таки такая блокировка получилась...


ИМХО,
lock table <ddd> in share row exclusive mode

Возможно, сценарий такой:

72: select ... s for update (TM 72:RS, TX 72:X) - Ok
62: lock table ... in share row exclusive mode (TM 62:SRX) - Ok
72: update ... s (TM 72:RX ждёт TM 62:SRX) - Block
62: update ... s (TX 62:X ждёт TX 72:X) - Block
29 июн 06, 14:18    [2825842]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
mcureenab

62: lock table ... in share row exclusive mode (TM 62:SRX) - Ok


Да как то не принято у нас в конторе так лочить таблицы. Всю жизнь обходились прикладными блокировками и select for update
29 июн 06, 15:00    [2826135]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Simon
Member

Откуда:
Сообщений: 974
может какой форинкей без индекса есть?
29 июн 06, 15:21    [2826286]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
Форинкеи все с индексами - у Кайта брал скрипт, проверял.
30 июн 06, 05:51    [2828608]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Deadlock при наличии индекса на внешний ключ

SY.
30 июн 06, 17:04    [2831791]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
mcureenab
Member

Откуда: Murmansk
Сообщений: 5928
Serge Stepanov
mcureenab

62: lock table ... in share row exclusive mode (TM 62:SRX) - Ok


Да как то не принято у нас в конторе так лочить таблицы. Всю жизнь обходились прикладными блокировками и select for update


Верю. Но иначе объяснить происхождение SRX затруднюсь. :o( Может быть у кого нибудь есть табличка, какие операции какие блокировки создают?
30 июн 06, 18:16    [2832078]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10040
Serge Stepanov
индексы на FK есть все


Any chance some индекс на FK uses DESC? DESC index is implemented as FBI, which means index will be ignored by locking mechanism. And if such index is on a self-referencing FK (common situation in hierarchical tables) you will get SRX. For example, session 1 issues:

SQL> -- Session 1.
SQL> CREATE TABLE t1(
  2                  child_id  NUMBER,
  3                  parent_id   NUMBER
  4                 )
  5  /

Table created.

SQL> ALTER TABLE t1
  2    ADD CONSTRAINT t1_pk
  3      PRIMARY KEY(child_id)
  4  /

Table altered.

SQL> ALTER TABLE t1
  2    ADD CONSTRAINT t1_fk
  3       FOREIGN KEY(parent_id)
  4         REFERENCES t1(child_id)
  5  /

Table altered.

SQL> INSERT
  2    INTO t1
  3    VALUES(1,NULL)
  4  /

1 row created.

SQL> CREATE INDEX t1_fk_idx
  2    ON t1(parent_id DESC)
  3  /

Index created.

SQL> INSERT
  2    INTO t1
  3    VALUES(2,1)
  4  /

1 row created.
SQL> 

Session 2 issues and waits:

SQL> -- Session 2.
SQL> DELETE t1
  2    WHERE child_id = 5
  3  /

Session 1 issues:

SQL> -- Session 1.
SQL> SELECT * FROM dba_waiters
  2  /

WAITING_SESSION HOLDING_SESSION LOCK_TYPE
--------------- --------------- --------------------------
MODE_HELD
----------------------------------------
MODE_REQUESTED                             LOCK_ID1   LOCK_ID2
---------------------------------------- ---------- ----------
            145             143 DML
Row-X (SX)
S/Row-X (SSX)                                 56886          0


SQL> 

SY.
P.S. Interestingly enough self-referencing fk in 8i does not result in SRX.
30 июн 06, 21:33    [2832523]     Ответить | Цитировать Сообщить модератору
 Re: Как получить блокировку SRX (SSX)  [new]
Serge Stepanov
Member

Откуда:
Сообщений: 6
2 SY

В bugfix описано получение дедлока в 9.2, кроме того при удалении из таблицы.
У меня 8.1.7 и дедлок возникает на UPDATE.
Кода сейчас перед глазами нету, вспоминая традиции, delete обычно у нас не делается, обходимся простановкой статусов, индексы на этой таблице по сути не надо было делать DESC.
Скорее всего тут что-то другое. На следующей неделе дождусь результатов LogMinera. Есть единственное предположение, что тут работает какой то процесс написанный клиентами, а не нами. А пока продолжаю поиски.

Мне вот что интересно: транзакции с клиента идут SERIALISEBLE, дедлок возникает в джобе, без этого уровня изолированности. Может ли SERIALISEBLE транзакция влиять.

Может ли к такой блокировке приводить недостаточное количество FREELIST'ов на таблице?
30 июн 06, 22:49    [2832615]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить