powered by simpleCommunicator - 2.0.48     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird + fbExpress lock conflict
25 сообщений из 204, страница 1 из 9
Firebird + fbExpress lock conflict
    #40112724
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Нарвался на lock conflict при попытке выполнить запрос UPDATE. Начал анализировать код, но, вроде бы, нет одновременно выполняющихся транзакций. Новая стартует не раньше, чем будет выполнен COMMIT или ROLLBACK для предыдущей. Да к тому же блокировка возникает не всегда, а лишь иногда.

Сумасшедшее предположение: приложение отработало слишком быстро, а сервер FB тормознул. В результате на сервер приходит команда на старт новой транзакции, когда предыдущая еще не завершилась. Имеем две различные транзакции, что делает возможным лок конфликт. Может такое быть? Если да, то есть ли культурный способ борьбы с этим безобразием, кроме как вставить что-нибудь типа Sleep(5000) перед StartTransaction?

[+]
Опечатка в заголовке темы: конечно же речь идет о dbExpress
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112727
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ,

Если Commit/Rollback выполнился без ошибок - значит, транзакция на сервере завершилась 100%.
Хоть я и не работал с dbExpress, но так должно быть.

Еще lock может случиться, если запись удалена другой активной транзакцией, или попала в SELECT FOR UPDATE WITH LOCK.
Или вообще у тебя no_rec_version и RC, там всё может быть.

Но скорее всего - ты что-то у себя не заметил.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112752
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ,

трейс всё покажет.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112777
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Тогда, наверное, вопросы по dbExpress

1. В приложении есть три TTransactionDesc, но TSQLConnection.InTransaction есть ли вообще активная транзакция. Можно ли узнать, какая именно транзакция стартовала? Можно ли узнать, что активны одновременно более одной транзакции? Если есть возможность как-то увязать их с TRANSACTION_ID в Firebird, то вообще замечательно.

2. Создается экземпляр TSQLQuery, в него загоняется запрос, выполняется и уничтожается. И все это без явного старта транзакции. Если имеется активная транзакция, то запрос выполнится в ней. А если активной транзакции нет, тогда как? Автоматически стартует новая транзакция? А когда она завершится? А если активных транзакций несколько, то в какой выполнится этот запрос? В транзакции с максимальным ID?

автортрейс всё покажет
Если можно, чуть побольше про то, что такое "трейс" и с чем его едят. Хотя бы на уровне ключевых слов и ссылок на описание.
Пока все: чем я располагаю, это вставка в приложение различных запросов мониторинга, которые выполняются при возникновении конфликта (с записью результатов в лог): а потом жду: когда у кого-нибудь из пользователей снова возникнет проблемная ситуация.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112786
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ
Тогда, наверное, вопросы по dbExpress
Тут этого никто не знает.

Ясно вот что:
1. Запрос не может быть выполнен без старта транзакции, следовательно, оно умеет их стартовать автоматически, как - хз;
2. Такую ситуацию можно получить, если запущено несколько программ, работающих с одной базой.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112791
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ,

почему такой странный выбор компонентов доступа? Приложение должно уметь работать не только с Firebird?

Про трейс https://firebirdsql.org/file/documentation/release_notes/html/en/2_5/rnfb25-trace.html
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112792
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ
автортрейс всё покажет

Если можно, чуть побольше про то, что такое "трейс" и с чем его едят. Хотя бы на уровне ключевых слов и ссылок на описание.Начать можно отсюда
https://firebirdsql.org/file/documentation/release_notes/html/en/2_5/rnfb25-trace.html

GJ
а потом жду: когда у кого-нибудь из пользователей снова возникнет проблемная ситуация.
Т.е. пользователей более одного. Тогда вот это вот
GJ
Новая стартует не раньше, чем будет выполнен COMMIT или ROLLBACK для предыдущей
вообще ни о чём.

Советую подумать над природой конфликтов обновления и понять, как они возникают.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112800
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Вот такой код в Delphi
Код: pascal
1.
2.
3.
4.
  qTMP.SQL.Text := SQLText; // текст UPDATE запроса
  BConnection.StartTransaction(Trans);
  qTMP.ExecSQL;
  BConnection.Commit(Trans);



Добавил для тестирования, что если возникает exception с текстотом "lock conflict on no wait transaction deadlock update conflicts with concurrent update concurrent transaction number is 1633032010", то выполняю вот такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
SELECT
  a.mon$attachment_id, a.mon$remote_address, a.mon$remote_process
FROM
  mon$transactions t
  INNER JOIN mon$attachments a ON a.mon$attachment_id = t.mon$attachment_id
WHERE
  t.mon$transaction_id = 1633032010



Результаты сбрасываю в лог. Приложение мое. Да и логика приложения такова, что каждый пользователь работает со своим документом.

Из личного опыта или из общих соображений может кто-нибудь подсказать, что здесь сделать, чтобы избежать конфликта либо выявить причину го возникновения?

По ссылке сейчас схожу гляну.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112805
pastor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot GJ#22397414]

как связаны между собой

qTMP
BConnection

?
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112811
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
qTMP и BConnection определены в DataModule. Значение qTMP.SQLConnection равно BConnection. Задается в design-time.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112819
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ
то выполняю вот такой запрос
Его нужно выполнять в отдельной тр-ции.
И нет гарантии, что он успеет поймать тр-цию конкурента.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112822
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
У меня он выполнялся после ROLLBACK транзакции с неудавшимся запросом UPDATE (вызов вставил в раздел EXCEPTION защищенного блога. Из сообщения об ошибке, кстати, и id транзакции-конкурента получил. Запрос выполнился, приложение и адрес в лог попали. Приложение мое. Поэтому и говорю так уверенно.

Сейчас рассматриваю вариант перед выполнением запроса UPDATE проверять количество транзакций в mon$trancactions по моему аттачменту. Больше ничего в голову не приходит.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112823
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ
Из личного опыта или из общих соображений может кто-нибудь подсказать, что здесь сделать, чтобы избежать конфликта либо выявить причину го возникновения?
Причина - обновление записи двумя активными транзакциями.
Способ избежать - не допускать такого.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112828
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
YuRock
Причина - обновление записи двумя активными транзакциями.
Способ избежать - не допускать такого.

-- Ватсон, это был математик.
-- Почему вы твак решили, Холмс?!
-- Ватсон, это же элементарно! Он подумал прежде, чем ответить. Его ответ абсолютно правильный. Его ответ совершенно бесполезный.
:)

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

Мне же интересно, что делать дальше. Ошибка не систематическая. Возникает достаточно редко. Так что даже не знаю, как мне поможет упомянутая выше трассировка. Я же не могу сидеть на всех компьютерах заказчика месяц в ожидании, когда возникнет ошибка. По сути, у меня есть только мое приложение и его лог-файл. Соответственно, мне нужно либо сделать более безопасный код (как-то проверять наличие другой транзакции перед запуском апдейта, либо сбрасывать в лог какую-то дополнительную информацию, которая позволит мне определить, что же это за транзакция осталась болтаться, и почему она осталась болтаться.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112830
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJСейчас рассматриваю вариант перед выполнением запроса UPDATE проверять количество транзакций в mon$trancactions по моему аттачменту.

Не надо пользоваться MON$ таблицами для не административных задач, иначе ваше приложение очень быстро встанет раком. Это раз.
А два, для не администраторов БД MON$ таблицы видят только данные о своих соединениях
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112835
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ,


Конфликты обновления в конкурентной среде - это норма. Их можно свести к минимуму грамотным проектированием и аккуратной реализацией,
но полностью избавиться - вряд ли. Поэтому нужно быть к ним готовым и уметь корректно обрабатывать.
И, конечно, нужно понимать их причину.

PS за 9 лет так и не научились ничему ?
https://www.sql.ru/forum/965872/
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112838
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Поскольку в моем случае я вижу проблемную транзакцию, значит тут все в порядке.
А чтобы приложение не встало раком, можно обращаться к таблицам мониторинга только для одного конкретного запроса UPDATE. А он выполняется не так уж и часто.

И я бы рад бы, но.... Есть альтернативы? Повторяю, ошибка не систематическая, возникает редко. Анализировать код на 100 тыс. строк (который дорабатывали 10 программистов на протяжении 15 лет) в поисках возможных причин возникновения такой ситуации -- это нереально. Вот и ищу способ как выкрутиться.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112839
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJМне же интересно, что делать дальше. Ошибка не систематическая.

Тебе известен запрос на котором она возникает. Тебе известна таблица, которую
этот запрос обновляет. Осталось только включить мозг и понять ЗАЧЕМ он эту
таблицу обновляет и ПОЧЕМУ этот запрос посылает больше одного пользователя.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112841
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
hvlad
GJ,
Конфликты обновления в конкурентной среде - это норма. Их можно свести к минимуму грамотным проектированием и аккуратной реализацией,
но полностью избавиться - вряд ли. Поэтому нужно быть к ним готовым и уметь корректно обрабатывать.
И, конечно, нужно понимать их причину.

PS за 9 лет так и не научились ничему ?
https://www.sql.ru/forum/965872/

Опять общие слова, что лучше быть богатым и здоровым, чем бедным и больным.
Я и обращаюсь с просьбой, чтобы с высоты собственного опыта подсказали мне, как именно мне поступить, чтобы локализовать причину или сделать код более безопасным.

А про 9 лет... По моему, можно только порадоваться, что в чужих приложениях, которые я поддерживаю, проблемы, с которыми я не могу справиться, возникают раз в 9 лет. В моих собственных приложениях у меня не возникает проблем, с которыми приходилось бы обращаться на форум.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112855
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJкак именно мне поступить, чтобы локализовать причину

Проанализировать всю цепочку триггеров на таблице, которая изменяется запросом,
выкидывающим ошибку.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112862
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJ
Опять общие слова, что лучше быть богатым и здоровым, чем бедным и больным.
Имеющий уши - услышит. Ты хочешь, чтобы тебе пальцем место в коде показали ? Легко - ошибка в 17-ой строке (ц)

GJ
Я и обращаюсь с просьбой, чтобы с высоты собственного опыта подсказали мне, как именно мне поступить, чтобы локализовать причину или сделать код более безопасным.
Уже сказали - трейс (аудит) чтобы найти причину, плюс обработка конфликтов в коде.
Не нравится ? Ну давай тогда стань "богатым и здоровым" ничего не делая. Нас научишь потом.

GJ
А про 9 лет... По моему, можно только порадоваться
Не возражаю - можно и порадоваться. Вот только эти самые грабли уже обсуждали 9 лет назад и рецепт был тот же. Удивительно ?
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112870
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112909
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Странно. Я, вроде, описал ситуацию. Трассировка не прокатывает, потому что ошибка не систематическая и возникает редко. Аудит, скорее всего, тоже не получится: не допустит заказчик до своих серверов. Ситуацию я вам обрисовал: и как код на Delphi выглядит, и сообщение об ошибке, и как я определил, что блокирующая транзакция в моем же приложении. Представьте, что задача по поиску этой проблемы вам выдал ваш начальник. Что будете делать? Расказывать ему о том, что такое блокировки, почему они возникают, и что нужно в коде аккуратно обрабатывать конфликты? Пока был только один содержательный совет: проанализировать триггеры.

Если в указанных мной условиях (возможны только модификация приложения и запись в лог-файл) нет нормального способа отыскать причину, то так и скажите, что такого способа нет, анализируй свои километры кода в поисках пропущенного завершения транзакции. Или более честный ответ "я такого способа не знаю", хоть это и бьет по самолюбию. Тогда я не буду здесь сидеть, а буду что-то изобретать... или даже анализировать километры кода. Пойду вставлять запросы к таблицам мониторинга запросы к mon$transactions и mon$statements, может там что-то нарою, что поможет выявить причину ошибки.


Спасибо. Все просто и понятно. Для данной проблемы мне это не поможет, но когда потребуется, буду знать, где посмотреть.
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112914
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GJПредставьте, что задача по поиску этой проблемы вам выдал ваш начальник. Что
будете делать?

Любое сообщение об ошибке в моём приложении идентифицирует её источник с
точностью до вызова API. Анализировать и искать уже ничего не надо, вся
необходимая информация есть в сообщении об ошибке. Осталось только пойти и
понять где я облажался.

Если приложение чужое, то первым и единственным вопросом будет "при каком
действии возникает ошибка?" Дальше просто идёшь в код и смотришь какие запросы
посылает это действие.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Firebird + fbExpress lock conflict
    #40112922
GJ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
GJ
Гость
Dimitry Sibiryakov

Если приложение чужое, то первым и единственным вопросом будет "при каком
действии возникает ошибка?" Дальше просто идёшь в код и смотришь какие запросы
посылает это действие.

Ошибка возникает при попытке выполнить запрос UPDATE. Я даже знаю строку, в которой это произошло. И даже знаю причину, почему это произошло. Есть большой и ветвистый код на Delphi с большим количеством подпрограмм, который постоянно что-то вычисляет, определяет, меняет... и все это записывает в таблицу либо посредством запросов UPDATE, либо -- SELECT FROM STORED_PROC. Вроде как все эти изменения вносятся в явно стартующих транзакциях, которые сразу же (ну, или почти сразу) завершаются. Где и почему оказалась незавершенная транзакция, я понять не могу. Поэтому даже подумал было сначала, что COMMIT на сервере может выполняться асинхронно, то есть мы команду COMMIT послали и продолжили выполнение кода, а сервер из-за нагрузки тормознул и не успел сразу эту транзакцию завершить. Но мне сказали, что так не бывает. Значит где-то как-то возникло условие, при котором выполнение программы прошло по такому пути, что обошло завершение транзакции. И мне это надо найти. Вот и пытаюсь каким-то образом угадать, где именно. Хотя бы узнать, какой именно запрос изменил запись, а транзакция осталась незавершенной. Как вариант, определить перед проблемным UPDATE, что транзакция уже имеется, и не стартовать новую, а выполнить в существующей. Но тут надо аккуратно все проанализировать, чтобы не напороться на какие-нибудь другие грабли.

Возможен вариант промежуточный: если на момент выполнения запроса UPDATE есть активная транзакция, сбросить в лог список всех запросов, которые в этой транзакции выполнялись. Все будет проще искать, чем рыть десятки тысяч строк плохо структурированного кода.
...
Рейтинг: 0 / 0
25 сообщений из 204, страница 1 из 9
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Firebird + fbExpress lock conflict
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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