powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / deadlock при update записи
25 сообщений из 49, страница 1 из 2
deadlock при update записи
    #38479684
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перерыл все интернеты, но никак не могу понять в чем может быть причина deadlock.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479694
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин,

Надо срочно менять интернеты. На вот такие , например. Ну а если взять вот такие , то вообще красота.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479707
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Имею след. запрос:

UPDATE OR INSERT INTO USERS_LOG (USER_ID, LAST_ACTIVE, IP_ADDRESS) VALUES ('6F175349428A6A4A93E8B1D65B9BEA78', CURRENT_TIMESTAMP, '127.0.0.1')

Он выполняется каждым клиентом (web-броузер через Ajax) раз в минуту. Иногда этот запрос создает deadlock. Таблица не имеет никаких триггеров.

Все транзацкии read write lock timeout 10
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479732
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonlineНадо срочно менять интернеты. На вот такие , например. Ну а если взять вот такие , то вообще красота.

Извините, я не успел дописать сообщение и случайно нажал комбинацией клавиш кнопку отправить.

Эту статью я читал. Ситуация происходит следующая:

1. Транзакция 1 (set transaction read write wait timeout 10) стартует и начинает выполнять запрос на update конкретной записи в таблице.
2. Видимо в этот же самый момент стартует Транзакция 2 с теме же параметрами и выполняет тот же самый запрос.
3. Транзакция 1 успешно завершается.
4. Транзакция 2 ничего не ждя выдает: "General error: -913 deadlock update conflicts with concurrent update concurrent transaction number is ..."

Но транзакции же wait, а значит, по моему мнению, транзакция 2 должна дождаться комита первой и выполнить запрос без ошибок.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479833
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинпо моему мнению, транзакция 2 должна дождаться комита первой и
выполнить запрос без ошибок.
Твоё мнение совпадает с мнением Ларри Эллисона, но отнюдь не Джима Старки. Поэтому иди-ка
с ним на Оракул.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479867
Fr0sT-Brutal
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему у двух разных клиентов одинаковые ID (иначе не было бы concurrent update)? Если для каждого будет уникальный, то проблема исчезнет.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479934
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такой длинный идентификатор клиента и не уникальный... Галактика в опасности? или консерватория?

Напомнил анекдот про ОченьДлинныйИдентификатор1,ОченьДлинныйИдентификатор2...

Fr0sT-BrutalЕсли для каждого будет уникальный, то проблема исчезнет.А если еще и не адейтить, то ее не будет "бай дизайн". Даже Таблоиду не удалось нагнуть сервер на конкурентных инсертах. :)
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479941
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyДаже Таблоиду не удалось нагнуть сервер на конкурентных инсертах. :)

Николаю удалось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479946
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНиколаю удалось.Павел Ишенинвыполняется каждым клиентом раз в минуту.Явно не с такой частотой шли инсерты.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479949
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Fr0sT-BrutalПочему у двух разных клиентов одинаковые ID (иначе не было бы concurrent update)? Если для каждого будет уникальный, то проблема исчезнет.

Так клиенты же одинаковые. Это web, и как следствие могут быть где-то задержки. Например, при коннекте из Норильска (чаще всего именно у них выскакивает этот deadlock) через их спутниковую связь. Таким образом, ajax запрос где-то задержался и нам на сервер вместо одного через минуту сразу прилетело 2.

В принципе ничего ужасного в этих deadlock нет, но хотелось бы избавиться если это возможно.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479968
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинхотелось бы избавиться если это возможно.инсерт "наше фсё". Опционально можно зачистить во время периодических регламентных работ.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479975
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПавел Ишенинпо моему мнению, транзакция 2 должна дождаться комита первой и
выполнить запрос без ошибок.
Твоё мнение совпадает с мнением Ларри Эллисона, но отнюдь не Джима Старки. Поэтому иди-ка
с ним на Оракул.


Спасибо Дмитрий. Мы используем как Oracle, так и Firebird, но первый раз столкнулись с разработкой под web с Firebird. Хотели решить проблему средствами СУБД, но если таким образом победить deadlock не получится, то будем решать с других сторон.

Возвращаясь к теме, мы проводили эксперименты блокируя запись из IBExpert, и в этом случае получали ожидаемый результат - firebird ждал положенные 10 (или около того) секунд и возвращал ошибку "lock timeout" (или что-то вроде), а не "deadlock". Отсюда и причина исходного вопроса о причине deadlock.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479985
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyПавел Ишенинхотелось бы избавиться если это возможно.инсерт "наше фсё". Опционально можно зачистить во время периодических регламентных работ.

Записанная информация используется для отображения активности пользователя в web-приложении. Если использовать только insert, то усложнится запрос select, а как следствие и время извлечения информации из СУБД. А скорость времени выполнения запросов в web-приложениях критически важна.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479986
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинОтсюда и причина исходного вопроса о причине deadlock.

Нет в исходном вопросе никакого "deadlock". Есть "update conflict", который возникает
всегда , когда параллельные транзакции изменяют одну и ту же запись. Вне зависимости
от параметра wait.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479991
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинDimitry Sibiryakovпропущено...

Твоё мнение совпадает с мнением Ларри Эллисона, но отнюдь не Джима Старки. Поэтому иди-ка
с ним на Оракул.


Спасибо Дмитрий. Мы используем как Oracle, так и Firebird, но первый раз столкнулись с разработкой под web с Firebird. Хотели решить проблему средствами СУБД, но если таким образом победить deadlock не получится, то будем решать с других сторон.

Возвращаясь к теме, мы проводили эксперименты блокируя запись из IBExpert, и в этом случае получали ожидаемый результат - firebird ждал положенные 10 (или около того) секунд и возвращал ошибку "lock timeout" (или что-то вроде), а не "deadlock". Отсюда и причина исходного вопроса о причине deadlock.

в примере, с которого все началось, запись НЕ БЛОКИРОВАНА
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479993
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинто усложнится запрос select,Правда? ну если написание select first 1... order by last_active desc вместо select ...
Павел Ишенина как следствие и время извлечения информации из СУБДровно одно индексное чтение в обоих случаях (если дизайн базы не с похмела делался).
...
Рейтинг: 0 / 0
deadlock при update записи
    #38479997
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинЕсли использовать только insertто не будет версий->мусора, который гарантированно появится при апдейтах.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480007
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovПавел ИшенинОтсюда и причина исходного вопроса о причине deadlock.

Нет в исходном вопросе никакого "deadlock". Есть "update conflict", который возникает
всегда , когда параллельные транзакции изменяют одну и ту же запись. Вне зависимости
от параметра wait.


deadlock есть в сообщении об ошибке с сервера. В любом случае, спасибо. Из вашего сообщения я понял, что эту ошибку никак не исправить средствами СУБД, а следовательно нужно искать решения на стороне web-приложения.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480014
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинскорость времени выполнения запросов в web-приложениях критически
важна.
Нет, если не баловаться таймаутом выполнения скриптов или использовать вменяемые языки
программирования вместо них.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480019
Фотография arni
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенин
Код: sql
1.
UPDATE OR INSERT INTO USERS_LOG (USER_ID, LAST_ACTIVE, IP_ADDRESS) VALUES ('6F175349428A6A4A93E8B1D65B9BEA78', CURRENT_TIMESTAMP, '127.0.0.1')

а если обновлять, только если таймстемп уже малость протух (более одной минуты)? Если такого рода запросы сыпятся без остановки, то возможно проредить update не помешает, чем снизить конкурентность.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
execute block(
  USER_ID type of column USERS_LOG.USER_ID = :USER_ID)
as
begin
  if (exists(select 1 from USERS_LOG where USER_ID=:USER_ID)) then
    update USERS_LOG
       set LAST_ACTIVE = CURRENT_TIMESTAMP, 
           IP_ADDRESS = '127.0.0.1'
     where USER_ID=:USER_ID
       and datediff(minute from LAST_ACTIVE to CURRENT_TIMESTAMP)>1; --обновляем c некоторой гранулярностью
  else
    INSERT INTO USERS_LOG 
      (USER_ID, LAST_ACTIVE, IP_ADDRESS) 
    VALUES 
      (:USER_ID, CURRENT_TIMESTAMP, '127.0.0.1');
end


ну и заменить транзакцию на nowait
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480026
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Ишенинdeadlock есть в сообщении об ошибке с сервера.
Это старый известный недостаток данного сообщения: в "братскую могилу" со строкой
"deadlock" собраны все конфликты. Именно поэтому читая сообщение об ошибке ни в коем
случае нельзя останавливаться на его первой строке
. По-настоящему полезная информация
приводится в последних строках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480028
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyПавел ИшенинЕсли использовать только insertто не будет версий->мусора, который гарантированно появится при апдейтах.

Мусор в этом случае появится в самой таблице + дополнительный индекс.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480054
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ИшенинИногда этот запрос создает deadlock.А почему это проблема? Раз дэдлок, значит запись уже есть, сам же пользователь ее и апдейтит, чего ее апдейтить повторно? поймал, обработал, юзеру можно и не показывать.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480161
Павел Ишенин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyПавел ИшенинИногда этот запрос создает deadlock.А почему это проблема? Раз дэдлок, значит запись уже есть, сам же пользователь ее и апдейтит, чего ее апдейтить повторно? поймал, обработал, юзеру можно и не показывать.

Юзеру эта ошибка не показывается.

Ребята, большое спасибо за разъяснение причины ошибки. Теперь, когда я понимаю причину, я найду подходящее решение. Тему можно закрывать.
...
Рейтинг: 0 / 0
deadlock при update записи
    #38480228
Таблоид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyДаже Таблоиду не удалось нагнуть сервер на конкурентных инсертах. :) чё-чё ?
...
Рейтинг: 0 / 0
25 сообщений из 49, страница 1 из 2
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / deadlock при update записи
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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