powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проблема с dead/lock после Rollback
25 сообщений из 56, страница 1 из 3
Проблема с dead/lock после Rollback
    #38558804
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот такой код:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  // создание объекта trLock: TIBTransaction с константами read_committed rec_version nowait
  try
    try
      // UPDATE одной всегда существующей записи
    except
      on E: Exception do begin
        ShowMessage( E.Message );
        Exit;
      end;
    end;

    // Выполнение операции (максимум несколько секунд)
  finally
    if trLock.InTransaction then trLock.Rollback;
    trLock.Free;
  end;



служит для того, чтобы исключить возможность одновременного выполнения определенной операции (с разных клиентов).

Так вот. Всё работает отлично, но, к сожалению, не всегда. Иногда, после определенного (достаточно длительного) периода работы программы исключение deadlock начинает происходить всегда. Лечится обычно закрытием всех клиентов, и затем - открытием.

Мне что-то подсказывает, что дело в многократном Rollback для одной и той же записи(остается много мусора, где-то у чего-то (временно) "башню сносит" и т.п.). Но на Commit переходить не совсем получается - при коммите эта запись будет отмечена триггером, как необходимая для репликации в центральную базу, а этого очень не хотелось бы - эти операции проходят часто, примерно раз в минуту, а запись на самом деле не меняется (SET TERMINAL_ID=TERMINAL_ID).
Да и не факт, что переход на Commit поможет.

Вопросы: как лучше всего попытаться решить данную проблему? В чём "на самом деле" проблема?

Firebird 2.1.1.17910
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38558806
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, хочу сразу добавить: программа зависнуть во время "Выполнения операции" не может - это выполняется в главном потоке, человеком. Если бы было зависание - зависла бы вся программа, а этого никогда не происходит.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38558832
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще забыл добавить, извиняюсь. D6 + IBX
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38558856
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockВ чём "на самом деле" проблема?
В нечтении http://ibase.ru/devinfo/pslock.htm и http://ibase.ru/devinfo/plocks.htm
В версии 2.1 уже есть SELECT FOR UPDATE WITH LOCK, и тем более уровень изоляции транзакции
consistency table preserve, которые позволяют заблокировать запись или таблицу без
создания версий.

PS: Репликация таблицы локов тоже выглядит довольно странно...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38558898
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Спасибо, буду читать.

PS. Это не таблица локов, это таблица с полезными данными. Просто для этих целей (блокировок) там как раз есть необходимые записи.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559002
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,

возможно, я уже паскаль не помню, но разве Exit не выводит код ЗА пределы finally? Зачем вот это насилие с trLock.Free - разве нельзя один раз создать объект, а потом использовать его много раз?
Ну и deadlock - это сообщение о том, что обновляемая запись заблокирована ДРУГОЙ транзакцией. Возможно, у вас теряется хэндл trLock из-за такого кода, и транзакция остается активной после успешного update.
Короче, я бы посоветовал этот кусок проверить FBscanner-ом или через трейс/аудит, чтобы убедиться, что транзакция действительно завершается.

Кроме того, по коду совершенно неясно, накой черт делать update, потом какие-то действия, а потом безусловный rollback в секции finally В ОДНОЙ короткой транзакции.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559006
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvразве Exit не выводит код ЗА пределы finally?
Нет. finally выполняет всегда, это его самое ценное качество. Но вот код, который аффтар в
него запихнул - полное УГ.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559008
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

1. Огромное спасибо! С SELECT FOR UPDATE WITH LOCK всё получилось. Не знаю, поможет ли это для решения проблемы (надеюсь), но по крайней мере ушли от вызова триггеров, и, соответственно, rollback - уже хорошо.

2. По воводу consistency table preserve. Если не сложно. Можно меня мордой тыкнуть, чтобы я не мучился? Какие это константы транзакции? Те же, что у меня, только no_rec_version? Я проверил - так вроде работает. Я прав?
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559010
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvКроме того, по коду совершенно неясно, накой черт делать update, потом какие-то действия, а потом безусловный rollback в секции finally В ОДНОЙ короткой транзакции.

UPDATE - просто для проверки, не "заблокирована" ли запись другой транзакцией. Чтобы если "заблокирована" - получить исключение и не выполнять никаких действий.
Теперь переделал на SELECT FOR UPDATE WITH LOCK
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559012
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovНо вот код, который аффтар в
него запихнул - полное УГ.
Запихнул туда то, что понятно и наглядно (для меня). Теперь там вместо rollback будет commit
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559014
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvВозможно, у вас теряется хэндл trLock из-за такого кода, и транзакция остается активной после успешного update.
Да нет, этот алгоритм работает. Только до поры - до времени.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559071
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockДа нет, этот алгоритм работает. Только до поры - до времени.
еще раз, чревовещаю:
deadlock возникает как правило при обновлении записи, которая уже обновлена в другой, незавершенной, транзакции.
То есть, буквально, у вас Rollback/Commit не срабатывает, и где-то теряется в коде. Я таких случаев уже насмотрелся, именно вот с этими динамическими созданиями-освобождениями транзакций. Всего одной кривой строчки в коде достаточно, чтобы получилась такая хреновня. Не хотите мониторить FBScanner/trace-audit, смотрите в mon$transactions. Не надо заниматься фигней, надо искать открытые транзакции, которые не должны быть таковыми.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559272
ooo_kontakt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
YuRockDimitry SibiryakovНо вот код, который аффтар в
него запихнул - полное УГ.
Запихнул туда то, что понятно и наглядно (для меня). Теперь там вместо rollback будет commit

Меня лично поразил вот этот момент:

"Но на Commit переходить не совсем получается - при коммите эта запись будет отмечена триггером , как необходимая для репликации в центральную базу, а этого очень не хотелось бы - эти операции проходят часто, примерно раз в минуту, а запись на самом деле не меняется (SET TERMINAL_ID=TERMINAL_ID)."

SET TERMINAL_ID=TERMINAL_ID раз в минуту с rollback.... да пусть даже и commit. Охренеть, извините. Зачем?! В чем смысл?!
Реально в триггере можно путем сравнения if (old.value<>new.value) then установить флаг репликации без особых проблем.
Создание "фантомных" TIBTransaction - это признак недопонимания транзакций вообще - и мне кажется, что для начала стоит почитать на ibase.ru статьи по теме длинных читающих и коротких пишущих транзакций - это снимает кучу проблем при разработке и доводке. .
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559883
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvеще раз, чревовещаю:
deadlock возникает как правило при обновлении записи, которая уже обновлена в другой, незавершенной, транзакции.
То есть, буквально, у вас Rollback/Commit не срабатывает, и где-то теряется в коде.

Я специально обновляю запись, чтобы получить deadlock в случае, если эта запись обновлена в другой транзакции. Неужели непонятно до сих пор?

Rollback/Commit срабатывает в любом случае - и при исключении, и при Exit, и если всё нормально. Транзакция (эта) завершается. И тем не менее проблема появляется через несколько дней работы этого алгоритма. Потому я и обратился на этот форум.

Естественно, я не могу посмотреть, что там было у заказчика в mon$transactions в этот момент. А Даже если б и смог (чисто теоретически) - это не помогло бы, ибо куча клиентов работает с базой в этот момент. Соединений 10 - минимум.

А сам я такоую ситуацию поймать, конечно же, не могу - у меня всё работает. Но случаи такие периодически происходят. Пару раз в месяц - точно. А программа работает на ~70 точках круглосуточно.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559892
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ooo_kontaktпочитать на ibase.ru статьи по теме длинных читающих и коротких пишущих транзакций - это снимает кучу проблем при разработке и доводке
ooo, а видеокарту мне поменять не недо? Извините, не сдержался, но может поможет при разработке и доводке, а то я с 2002 читаю эти статьи и не только, с тех пор как эту программу сделал запустил еще на ФБ 1.0, вернее, с 2003, как с BDE перевел на IBX, а никак не помогает - не могу всё запомнить. Особенно, учитывая, что многое только на опыте приходит, методом проб.

ooo_kontaktРеально в триггере можно путем сравнения if (old.value<>new.value) then установить флаг репликации без особых проблем
Я деньги платить не буду. Даже за дельные советы.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559902
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdv, Dimitry Sibiryakov,

пожалуйста, ответьте для успокоения. Если я в своём алгоритме UPDATE заменю на

Код: sql
1.
SELECT FIRST 1 1 FROM ... WHERE ... FOR UPDATE WITH LOCK

- одна запись,
транзакцию сделаю read_committed no_rec_version nowait,
и RollBack заменю на Commit,

то мусор в базе будет накапливаться? И чем это может быть чревато? (если может)
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559936
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЕстественно, я не могу посмотреть, что там было у заказчика в
mon$transactions в этот момент.
В чём проблема-то? Заказчик не даёт тебе доступа к своему серверу и при этом так туп, что
неспособен выполнить скрипт в isql и прислать тебе результаты?..

YuRockА Даже если б и смог (чисто теоретически) - это не помогло бы, ибо куча
клиентов работает с базой в этот момент. Соединений 10 - минимум.
И чо? Застрявшая транзакция принадлежит только одному из них. Название приложения,
создавшего этот коннект, видно в mon$attachments. Время её старта - тоже. Ты в своём
приложении неспособен вести лог действий, включая старты и финиши транзакций?..

YuRockответьте для успокоения.
Отвечаю: вопрос бредовый, локи и мусор никак не связаны с уровнем изоляции транзакций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38559951
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ чём проблема-то? Заказчик не даёт тебе доступа к своему серверу и при этом так туп, что
неспособен выполнить скрипт в isql и прислать тебе результаты?..
И то, и другое, и третье.
1. Я узнаю о тм, что проблема происходила, в лучшем случае на следующий день.
2. Заказчик - продавец в магазине (грубо говоря). Он вообще мало на что способен. Максимум, что он может сделать под чутким руководством службы поддержки по телефону- это перезапустить программу (компьютер), что помогает.

Dimitry SibiryakovИ чо? Застрявшая транзакция принадлежит только одному из них. Название приложения,
создавшего этот коннект, видно в mon$attachments. Время её старта - тоже. Ты в своём
приложении неспособен вести лог действий, включая старты и финиши транзакций?..
Название приложения будет почти всегда одинаковое. В самом приложении - минимум два подключения, в одном из которых всегда висит readonly транзакция,
+ к нему подключены куча плагинов, каждый из которых открывает как минимум одно подключение.

Нет, увы, не способен :(. Если бы изначально пришла идея в функцию старта транзакции вставить лог (ну и завершать тоже с логом) - тогда другое дело. Но эта идея тогда не пришла, а теперь, когда уже 60 мегабайт только файлов *.pas и *.dfm - это сделать вообще проблематично :(
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560000
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovвопрос бредовый, локи и мусор никак не связаны с уровнем изоляции транзакций.
Не отрицаю, но мой изначальный вопрос (в топике) был таков: "В чём "на самом деле" проблема?". Так как прямого ответа на него я так и не получил (ибо алгоритм, который я привёл - по логике правильный, и по идее должен работать без проблем вечно), то я продолжаю подозревать, что "на самом деле" проблема была в том, что после каждого RollBack в базе оставались и накапливались версии записи с соответствующим идентификатором транзакции, которая rolled back, и со временем весь этот механизм мог начать тормозить или ещё как-то глючить.

Потому я Вас и прошу ответить - подобного мусора снанет меньше при SELECT FOR UPDATE WITH LOCK?
А как уровень изоляции мне может помочь в этом случае, я честно говоря, пока вообще не особо понял, т.к. меня интересует в логике просто блокировка записи. Т.е. я не понимаю, чем rec_version хуже no_ rec_version для данной задачи (т.е. получить исключение deadlock). Потому и прошу объяснить.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560002
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockтеперь, когда уже 60 мегабайт только файлов *.pas и *.dfm - это сделать
вообще проблематично :(
Да ну? Кинуть всего на одну форму всего один TIBMonitor для тебя проблематично?.. Ню-ню...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560023
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovДа ну? Кинуть всего на одну форму всего один TIBMonitor для тебя проблематично?.. Ню-ню...
Да, если переделать все во всех коннекшены - установить traceflags. Затем разбирать текст в сообщении. Но что я получу? Количество открытых транзакций? Их может быть несколько, и это нормальная ситуация. Т.е. как это может помочь, непонятно. Более того, я получу эту инфу после того, как везде обновится версия, а затем проявится проблема (проявится и засветится, что не одно и тоже - чаще всего молчат).

Поэтому я всё же прошу Вас ответить на вопросы в моём предыдущем посте.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560088
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock как с BDE перевел на IBX, а никак не помогает - не могу всё запомнить.
да что там запоминать-то...
YuRockЯ деньги платить не буду. Даже за дельные советы.
ну и нафиг. сам учиться не хочу, деньги платить не хочу, значит в сад. Я уже предложения по мониторингу изложил.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560132
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockмой изначальный вопрос (в топике) был таков: "В чём "на самом деле"
проблема?". Так как прямого ответа на него я так и не получил
А ты всерьёз на него рассчитывал?.. Что, прямо так: без анализа логов, без знания твоего
кода, последовательности работы и т.п. ткнуть пальцем и сказать "здесь проблема"?.. Так не
бывает. (Не, один раз в жизни мне это удалось, но там случай был особый.)

YuRockподобного мусора снанет меньше при SELECT FOR UPDATE WITH LOCK?
Нет.

YuRockчем rec_version хуже no_rec_version для данной задачи (т.е. получить
исключение deadlock).
Тем, что вызывает меньше deadlock, которые ты так жаждешь получать.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560155
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvда что там запоминать-то...

Говорит человек, написавший все эти статьи :)

kdvYuRockЯ деньги платить не буду. Даже за дельные советы.
ну и нафиг. сам учиться не хочу, деньги платить не хочу, значит в сад. Я уже предложения по мониторингу изложил.
[/quote]
kdv, ну не сдержался я. Человек мне начал довать советы (при чем абсолютно бессмысленные) по оптимизации репликациции базы. При чём это к топику? Я извиняюсь еще раз.

В сад так в сад. Советы - советами, одним я воспользовался (о SELECT FOR UPDATE WITH LOCK) - большое спасибо. Жаль, что потом не получил ответов ни на один из своих вопросов.
...
Рейтинг: 0 / 0
Проблема с dead/lock после Rollback
    #38560160
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
уже частично получил.
...
Рейтинг: 0 / 0
25 сообщений из 56, страница 1 из 3
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Проблема с dead/lock после Rollback
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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