|
|
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
вот такой код: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. служит для того, чтобы исключить возможность одновременного выполнения определенной операции (с разных клиентов). Так вот. Всё работает отлично, но, к сожалению, не всегда. Иногда, после определенного (достаточно длительного) периода работы программы исключение deadlock начинает происходить всегда. Лечится обычно закрытием всех клиентов, и затем - открытием. Мне что-то подсказывает, что дело в многократном Rollback для одной и той же записи(остается много мусора, где-то у чего-то (временно) "башню сносит" и т.п.). Но на Commit переходить не совсем получается - при коммите эта запись будет отмечена триггером, как необходимая для репликации в центральную базу, а этого очень не хотелось бы - эти операции проходят часто, примерно раз в минуту, а запись на самом деле не меняется (SET TERMINAL_ID=TERMINAL_ID). Да и не факт, что переход на Commit поможет. Вопросы: как лучше всего попытаться решить данную проблему? В чём "на самом деле" проблема? Firebird 2.1.1.17910 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 17:00:41 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Да, хочу сразу добавить: программа зависнуть во время "Выполнения операции" не может - это выполняется в главном потоке, человеком. Если бы было зависание - зависла бы вся программа, а этого никогда не происходит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 17:03:29 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Еще забыл добавить, извиняюсь. D6 + IBX ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 17:17:25 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 17:35:27 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Спасибо, буду читать. PS. Это не таблица локов, это таблица с полезными данными. Просто для этих целей (блокировок) там как раз есть необходимые записи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 18:10:53 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRock, возможно, я уже паскаль не помню, но разве Exit не выводит код ЗА пределы finally? Зачем вот это насилие с trLock.Free - разве нельзя один раз создать объект, а потом использовать его много раз? Ну и deadlock - это сообщение о том, что обновляемая запись заблокирована ДРУГОЙ транзакцией. Возможно, у вас теряется хэндл trLock из-за такого кода, и транзакция остается активной после успешного update. Короче, я бы посоветовал этот кусок проверить FBscanner-ом или через трейс/аудит, чтобы убедиться, что транзакция действительно завершается. Кроме того, по коду совершенно неясно, накой черт делать update, потом какие-то действия, а потом безусловный rollback в секции finally В ОДНОЙ короткой транзакции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:02:41 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdvразве Exit не выводит код ЗА пределы finally? Нет. finally выполняет всегда, это его самое ценное качество. Но вот код, который аффтар в него запихнул - полное УГ. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:05:38 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, 1. Огромное спасибо! С SELECT FOR UPDATE WITH LOCK всё получилось. Не знаю, поможет ли это для решения проблемы (надеюсь), но по крайней мере ушли от вызова триггеров, и, соответственно, rollback - уже хорошо. 2. По воводу consistency table preserve. Если не сложно. Можно меня мордой тыкнуть, чтобы я не мучился? Какие это константы транзакции? Те же, что у меня, только no_rec_version? Я проверил - так вроде работает. Я прав? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:05:44 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdvКроме того, по коду совершенно неясно, накой черт делать update, потом какие-то действия, а потом безусловный rollback в секции finally В ОДНОЙ короткой транзакции. UPDATE - просто для проверки, не "заблокирована" ли запись другой транзакцией. Чтобы если "заблокирована" - получить исключение и не выполнять никаких действий. Теперь переделал на SELECT FOR UPDATE WITH LOCK ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:10:11 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovНо вот код, который аффтар в него запихнул - полное УГ. Запихнул туда то, что понятно и наглядно (для меня). Теперь там вместо rollback будет commit ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:11:31 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdvВозможно, у вас теряется хэндл trLock из-за такого кода, и транзакция остается активной после успешного update. Да нет, этот алгоритм работает. Только до поры - до времени. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 20:12:53 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRockДа нет, этот алгоритм работает. Только до поры - до времени. еще раз, чревовещаю: deadlock возникает как правило при обновлении записи, которая уже обновлена в другой, незавершенной, транзакции. То есть, буквально, у вас Rollback/Commit не срабатывает, и где-то теряется в коде. Я таких случаев уже насмотрелся, именно вот с этими динамическими созданиями-освобождениями транзакций. Всего одной кривой строчки в коде достаточно, чтобы получилась такая хреновня. Не хотите мониторить FBScanner/trace-audit, смотрите в mon$transactions. Не надо заниматься фигней, надо искать открытые транзакции, которые не должны быть таковыми. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.02.2014, 21:24:56 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
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 статьи по теме длинных читающих и коротких пишущих транзакций - это снимает кучу проблем при разработке и доводке. . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 06:16:03 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdvеще раз, чревовещаю: deadlock возникает как правило при обновлении записи, которая уже обновлена в другой, незавершенной, транзакции. То есть, буквально, у вас Rollback/Commit не срабатывает, и где-то теряется в коде. Я специально обновляю запись, чтобы получить deadlock в случае, если эта запись обновлена в другой транзакции. Неужели непонятно до сих пор? Rollback/Commit срабатывает в любом случае - и при исключении, и при Exit, и если всё нормально. Транзакция (эта) завершается. И тем не менее проблема появляется через несколько дней работы этого алгоритма. Потому я и обратился на этот форум. Естественно, я не могу посмотреть, что там было у заказчика в mon$transactions в этот момент. А Даже если б и смог (чисто теоретически) - это не помогло бы, ибо куча клиентов работает с базой в этот момент. Соединений 10 - минимум. А сам я такоую ситуацию поймать, конечно же, не могу - у меня всё работает. Но случаи такие периодически происходят. Пару раз в месяц - точно. А программа работает на ~70 точках круглосуточно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 14:39:47 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
ooo_kontaktпочитать на ibase.ru статьи по теме длинных читающих и коротких пишущих транзакций - это снимает кучу проблем при разработке и доводке ooo, а видеокарту мне поменять не недо? Извините, не сдержался, но может поможет при разработке и доводке, а то я с 2002 читаю эти статьи и не только, с тех пор как эту программу сделал запустил еще на ФБ 1.0, вернее, с 2003, как с BDE перевел на IBX, а никак не помогает - не могу всё запомнить. Особенно, учитывая, что многое только на опыте приходит, методом проб. ooo_kontaktРеально в триггере можно путем сравнения if (old.value<>new.value) then установить флаг репликации без особых проблем Я деньги платить не буду. Даже за дельные советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 14:46:52 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdv, Dimitry Sibiryakov, пожалуйста, ответьте для успокоения. Если я в своём алгоритме UPDATE заменю на Код: sql 1. - одна запись, транзакцию сделаю read_committed no_rec_version nowait, и RollBack заменю на Commit, то мусор в базе будет накапливаться? И чем это может быть чревато? (если может) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 14:53:26 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRockЕстественно, я не могу посмотреть, что там было у заказчика в mon$transactions в этот момент. В чём проблема-то? Заказчик не даёт тебе доступа к своему серверу и при этом так туп, что неспособен выполнить скрипт в isql и прислать тебе результаты?.. YuRockА Даже если б и смог (чисто теоретически) - это не помогло бы, ибо куча клиентов работает с базой в этот момент. Соединений 10 - минимум. И чо? Застрявшая транзакция принадлежит только одному из них. Название приложения, создавшего этот коннект, видно в mon$attachments. Время её старта - тоже. Ты в своём приложении неспособен вести лог действий, включая старты и финиши транзакций?.. YuRockответьте для успокоения. Отвечаю: вопрос бредовый, локи и мусор никак не связаны с уровнем изоляции транзакций. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 15:15:24 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovВ чём проблема-то? Заказчик не даёт тебе доступа к своему серверу и при этом так туп, что неспособен выполнить скрипт в isql и прислать тебе результаты?.. И то, и другое, и третье. 1. Я узнаю о тм, что проблема происходила, в лучшем случае на следующий день. 2. Заказчик - продавец в магазине (грубо говоря). Он вообще мало на что способен. Максимум, что он может сделать под чутким руководством службы поддержки по телефону- это перезапустить программу (компьютер), что помогает. Dimitry SibiryakovИ чо? Застрявшая транзакция принадлежит только одному из них. Название приложения, создавшего этот коннект, видно в mon$attachments. Время её старта - тоже. Ты в своём приложении неспособен вести лог действий, включая старты и финиши транзакций?.. Название приложения будет почти всегда одинаковое. В самом приложении - минимум два подключения, в одном из которых всегда висит readonly транзакция, + к нему подключены куча плагинов, каждый из которых открывает как минимум одно подключение. Нет, увы, не способен :(. Если бы изначально пришла идея в функцию старта транзакции вставить лог (ну и завершать тоже с логом) - тогда другое дело. Но эта идея тогда не пришла, а теперь, когда уже 60 мегабайт только файлов *.pas и *.dfm - это сделать вообще проблематично :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 15:29:17 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovвопрос бредовый, локи и мусор никак не связаны с уровнем изоляции транзакций. Не отрицаю, но мой изначальный вопрос (в топике) был таков: "В чём "на самом деле" проблема?". Так как прямого ответа на него я так и не получил (ибо алгоритм, который я привёл - по логике правильный, и по идее должен работать без проблем вечно), то я продолжаю подозревать, что "на самом деле" проблема была в том, что после каждого RollBack в базе оставались и накапливались версии записи с соответствующим идентификатором транзакции, которая rolled back, и со временем весь этот механизм мог начать тормозить или ещё как-то глючить. Потому я Вас и прошу ответить - подобного мусора снанет меньше при SELECT FOR UPDATE WITH LOCK? А как уровень изоляции мне может помочь в этом случае, я честно говоря, пока вообще не особо понял, т.к. меня интересует в логике просто блокировка записи. Т.е. я не понимаю, чем rec_version хуже no_ rec_version для данной задачи (т.е. получить исключение deadlock). Потому и прошу объяснить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 15:51:35 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRockтеперь, когда уже 60 мегабайт только файлов *.pas и *.dfm - это сделать вообще проблематично :( Да ну? Кинуть всего на одну форму всего один TIBMonitor для тебя проблематично?.. Ню-ню... Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 15:52:57 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovДа ну? Кинуть всего на одну форму всего один TIBMonitor для тебя проблематично?.. Ню-ню... Да, если переделать все во всех коннекшены - установить traceflags. Затем разбирать текст в сообщении. Но что я получу? Количество открытых транзакций? Их может быть несколько, и это нормальная ситуация. Т.е. как это может помочь, непонятно. Более того, я получу эту инфу после того, как везде обновится версия, а затем проявится проблема (проявится и засветится, что не одно и тоже - чаще всего молчат). Поэтому я всё же прошу Вас ответить на вопросы в моём предыдущем посте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 16:06:08 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRock как с BDE перевел на IBX, а никак не помогает - не могу всё запомнить. да что там запоминать-то... YuRockЯ деньги платить не буду. Даже за дельные советы. ну и нафиг. сам учиться не хочу, деньги платить не хочу, значит в сад. Я уже предложения по мониторингу изложил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 16:46:51 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
YuRockмой изначальный вопрос (в топике) был таков: "В чём "на самом деле" проблема?". Так как прямого ответа на него я так и не получил А ты всерьёз на него рассчитывал?.. Что, прямо так: без анализа логов, без знания твоего кода, последовательности работы и т.п. ткнуть пальцем и сказать "здесь проблема"?.. Так не бывает. (Не, один раз в жизни мне это удалось, но там случай был особый.) YuRockподобного мусора снанет меньше при SELECT FOR UPDATE WITH LOCK? Нет. YuRockчем rec_version хуже no_rec_version для данной задачи (т.е. получить исключение deadlock). Тем, что вызывает меньше deadlock, которые ты так жаждешь получать. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 17:13:37 |
|
||
|
Проблема с dead/lock после Rollback
|
|||
|---|---|---|---|
|
#18+
kdvда что там запоминать-то... Говорит человек, написавший все эти статьи :) kdvYuRockЯ деньги платить не буду. Даже за дельные советы. ну и нафиг. сам учиться не хочу, деньги платить не хочу, значит в сад. Я уже предложения по мониторингу изложил. [/quote] kdv, ну не сдержался я. Человек мне начал довать советы (при чем абсолютно бессмысленные) по оптимизации репликациции базы. При чём это к топику? Я извиняюсь еще раз. В сад так в сад. Советы - советами, одним я воспользовался (о SELECT FOR UPDATE WITH LOCK) - большое спасибо. Жаль, что потом не получил ответов ни на один из своих вопросов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.02.2014, 17:23:05 |
|
||
|
|

start [/forum/topic.php?fid=40&msg=38560155&tid=1563887]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
158ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
| others: | 187ms |
| total: | 431ms |

| 0 / 0 |
