powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / deadlock handling
16 сообщений из 16, страница 1 из 1
deadlock handling
    #39395866
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется конструкция:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
    PROCEDURE CREATE_STEP1( 
        p_usr_key         IN      VARCHAR2
        )
    AS
    BEGIN
        BEGIN
            INSERT INTO CONTACT (USR_KEY)
            SELECT p_usr_key FROM DUAL
            WHERE NOT EXISTS(SELECT * FROM CONTACT WHERE USR_KEY = p_usr_key );
        EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
                    NULL;
                   WHEN -60 /*DEADLOCK_DETECTED*/ THEN
                    NULL;
        END;
       CREATE_STEP2(p_usr_key); /*еще insert в другую таблицу*/
     END;



Правильно ли я пониманию, что изменения сделанные в CREATE_STEP2 будут сделаны и закомичены?

Код: plsql
1.
2.
3.
4.
BEGIN
   CREATE_STEP1(12345);
   COMMIT;
END;
...
Рейтинг: 0 / 0
deadlock handling
    #39395975
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muma1Правильно ли я пониманиюНет. Некомпилируемый код не может производить никаких изменений.
...
Рейтинг: 0 / 0
deadlock handling
    #39396044
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elicmuma1Правильно ли я пониманиюНет. Некомпилируемый код не может производить никаких изменений.
Я не правильно поставил вопрос ?

Могу ли я рассматривать "Deadlock detected" как любое другое EXCEPTION ?
Буду ли я иметь в таблице msn_tmp2 2 записи со значением 8173, если этот код начнет выполняться одновременно в двух сессиях?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE
  DEADLOCK_DETECTED EXCEPTION;
  PRAGMA EXCEPTION_INIT(DEADLOCK_DETECTED, -60);
  p_usr_key varchar2(30):= '8173';
BEGIN
    BEGIN
        INSERT INTO MSN_TMP1 (USR_KEY) /*USR_KEY IS PRIMARY KEY*/
        SELECT p_usr_key FROM DUAL
        WHERE NOT EXISTS(SELECT * FROM MSN_TMP1 WHERE  USR_KEY = p_usr_key );
    EXCEPTION WHEN DUP_VAL_ON_INDEX THEN 
                DBMS_OUTPUT.PUT_LINE('DUP_VAL_ON_INDEX1');
               WHEN DEADLOCK_DETECTED THEN
                DBMS_OUTPUT.PUT_LINE('deadlock1');
    END;
    INSERT INTO MSN_TMP2 (CONTACT_KEY) values (p_usr_key); /*CONTACT_KEY IS not PRIMARY KEY*/
    COMMIT;
END;
...
Рейтинг: 0 / 0
deadlock handling
    #39396076
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Оберни вставку автономкой. И deadlock не потребуется.
...
Рейтинг: 0 / 0
deadlock handling
    #39396091
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо, это хороший совет, но не ответ. Автономка не спасет от deadlock.
...
Рейтинг: 0 / 0
deadlock handling
    #39396106
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muma1Автономка не спасет от deadlock.Заблуждаешься.
...
Рейтинг: 0 / 0
deadlock handling
    #39396179
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Автономка это просто еще одна транзакция. И в ней может быть exception. В том числе и deadlock.
Почему я заблуждаюсь?
...
Рейтинг: 0 / 0
deadlock handling
    #39396214
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muma1Почему я заблуждаюсь?В транзакции из одного insert-а не может быть deadlock-а.
...
Рейтинг: 0 / 0
deadlock handling
    #39396235
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Elicmuma1Почему я заблуждаюсь?В транзакции из одного insert-а не может быть deadlock-а.
Верно. но я же спрашивал авторесли этот код начнет выполняться одновременно в двух сессиях?
Ничто не мешает двум транзакциям начаться одновременно в разных сессиях.
...
Рейтинг: 0 / 0
deadlock handling
    #39396247
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muma1Верно. но я же спрашивал авторесли этот код начнет выполняться одновременно в двух сессиях?Ничто не мешает двум транзакциям начаться одновременно в разных сессиях.А я о том, что нужно делать, чтобы не задаваться вопросом о deadlock-е вообще.
...
Рейтинг: 0 / 0
deadlock handling
    #39396264
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С чего вообще возникло подозрение на DEADLOCK?
Хоть примерно-то понятно когда и из-за чего он возникает?

Вставка значений в разных сессиях может привести (и часто приводит) к БЛОКИРОВКЕ (на какое-то время), но к ВЗАИМОБЛОКИРОВКЕ достаточно редко
...
Рейтинг: 0 / 0
deadlock handling
    #39396339
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вячеслав ЛюбомудровС чего вообще возникло подозрение на DEADLOCK?
Никаких подозрений. При хорошей нагрузке реальная ситуация:
Deadlock graph:
---------Blocker(s)-------- ---------Waiter(s)---------
Resource Name process session holds waits process session holds waits
TX-00020012-008bab5f 132 133 X 115 629 S
TX-0005000b-008f0edc 115 629 X 132 133 S

session 133: DID 0001-0084-00036BFF session 629: DID 0001-0073-0008BF31
session 629: DID 0001-0073-0008BF31 session 133: DID 0001-0084-00036BFF

Rows waited on:
Session 133: no row
Session 629: no row

----- Information for the OTHER waiting sessions -----
Session 629:
current SQL:
INSERT INTO MSN_CONTACT (CPT_ID, USR_KEY, CONTACT_NAME) SELECT :B1 , :B2 , NVL(USR_LOGIN, :B3 ) FROM DUAL LEFT JOIN USER_MASTER UM ON UM.USR_ID = :B2 AND :B1 IN (8170, 8320, 8278, 8299) WHERE NOT EXISTS(SELECT * FROM MSN_CONTACT WHERE CONTACT_KEY = :B4 )

----- End of information for the OTHER waiting sessions -----

Information for THIS session:

----- Current SQL Statement for this session (sql_id=fcxhq8q1kjp9f) -----
INSERT INTO MSN_CONTACT (CPT_ID, USR_KEY, CONTACT_NAME) SELECT :B1 , :B2 , NVL(USR_LOGIN, :B3 ) FROM DUAL LEFT JOIN USER_MASTER UM ON UM.USR_ID = :B2 AND :B1 IN (8170, 8320, 8278, 8299) WHERE NOT EXISTS(SELECT * FROM MSN_CONTACT WHERE CONTACT_KEY = :B4 )
----- PL/SQL Stack -----
----- PL/SQL Call Stack -----
object line object
handle number name
0xbfef28e60 55 package body VIDEKOMASTER.PACK_MSN
0xc0ddc0340 1 anonymous block
===================================================


как вы видете, записей еще нет ни в одной сессии.
И да, deadlock получается из-за использования CONTRAINT FOREIGN KEY для USR_ID, ссылающийся на другую таблицу. Но это никак не меняет сути вопроса.
но к ВЗАИМОБЛОКИРОВКЕ достаточно редко Верно. Но "редко" - это относительно часто по сравнению с "никогда". Имменно из-за редкого случая мне не хочется всегда
делать еще один LOCK(что опять не безопасно) на запись в другой таблице. Тем более, что у меня уже есть в этом месте вероятность DUP_VAL_ON_INDEX. Вот и возникла идея перехватить и deadlock.
По существу можно, пожалуйста?
...
Рейтинг: 0 / 0
deadlock handling
    #39396364
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
muma1И да, deadlock получается из-за использования CONTRAINT FOREIGN KEY для USR_ID, ссылающийся на другую таблицу. Но это никак не меняет сути вопроса.Индекс-то есть на внешний ключ?
muma1 но к ВЗАИМОБЛОКИРОВКЕ достаточно редко Верно. Но "редко" - это относительно часто по сравнению с "никогда". Имменно из-за редкого случая мне не хочется всегда
делать еще один LOCK(что опять не безопасно) на запись в другой таблице. Тем более, что у меня уже есть в этом месте вероятность DUP_VAL_ON_INDEX. Вот и возникла идея перехватить и deadlock.
По существу можно, пожалуйста?У тебя в графе ожиданий X и S для TX
Это не типично. Либо внешние ключи, либо ITL (что в новых версиях достаточно редко), либо BITMAP индексы

Ну и наиболее частая причина -- нарушение порядка. Если уж вставляешь -- вставляй упорядоченно, чтоб не получилось классической ситуации -- один вставляет 5 и 10, а второй 10 и 5

А по-существу что ты хочешь услышать? Ну перехватил ты исключение. Проглотил , только какую-то хрень записал во внутренний буфер. Обработкой это назвать трудно
...
Рейтинг: 0 / 0
deadlock handling
    #39396366
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вячеслав Любомудровдостаточно редкоЕсли в юник вставлять по две записи на транзакцию в случайном порядке, то редкость уже соизмеряется с количеством вставок.
...
Рейтинг: 0 / 0
deadlock handling
    #39396374
Вячеслав Любомудров
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это может часто нарушаться в ad-hoc вставках
Но, обычно в процедурах проектируют вполне себе порядок
...
Рейтинг: 0 / 0
deadlock handling
    #39396666
muma1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем Cпасибо.
Помогли ВСЕ советы и замечания.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / deadlock handling
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]