|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJЗначит где-то как-то возникло условие, при котором выполнение программы прошло по такому пути, что обошло завершение транзакции. Не обязательно. Просто два пользователя одновременно нажали одну и ту же кнопку. Твой план искать незавершённую транзакцию в данном случае бесполезен и только тратит зря время. Надо сделать так чтобы этот конкретный известный тебе запрос перестал вызывать конфликты обновления. То есть либо его устранить совсем, либо превратить в INSERT. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 17:41 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ Как вариант, определить перед проблемным UPDATE, что транзакция уже имеется, и не стартовать новую, а выполнить в существующей. Но тут надо аккуратно все проанализировать, чтобы не напороться на какие-нибудь другие грабли. Я даже скажу на какие. По какой-то причине стартовавший эту транзакцию модуль решит её откатить. И откатит вместе с изменениями в модуле, содержащем "проблемный" апдейт, который будет искренне уверен, что он свою задачу выполнил. Или модуль, содержащий "проблемный" апдейт закоммитит или отроллбачит транзакцию вместе с изменениями вызвавшего модуля или даже цепочки модулей. После чего "проблемными" станут запросы-коммиты-роллбаки в этой цепочке. Я правильно понимаю что dbExpress - это архитектурно что-то вроде BDE? Тогда от проблемы без рытья кода не уйти. В этой архитектуре использование одной глобальной транзакции разными модулями - это принцип, и модуль в первых строках должен определять активна транзакция или нет. Если активна - не коммитить и не роллбачить результат, пусть вызывающий решает. А если нет - стартовать и и завершать самостоятельно. Ибо один и тот же модуль может быть активирован разными путями-цепочками вызывающих с разной логикой. И вырубить опцию автостарт-автокоммит топором, во избежание. В других архитектурах тоже бывает потребность в таких фокусах, но здесь это принцип. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 17:47 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov GJЗначит где-то как-то возникло условие, при котором выполнение программы прошло по такому пути, что обошло завершение транзакции. Не обязательно. Просто два пользователя одновременно нажали одну и ту же кнопку. Твой план искать незавершённую транзакцию в данном случае бесполезен и только тратит зря время. Надо сделать так чтобы этот конкретный известный тебе запрос перестал вызывать конфликты обновления. То есть либо его устранить совсем, либо превратить в INSERT. Он бьёт себя пяткой в грудь что конфликтующие транзакции в стартованы одном экземпляре приложения. Но ты прав, ибо - никому нельзя верить, никому! Даже себе! Ведь хотел же только пукнуть... ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 17:50 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov GJЗначит где-то как-то возникло условие, при котором выполнение программы прошло по такому пути, что обошло завершение транзакции. Не обязательно. Просто два пользователя одновременно нажали одну и ту же кнопку. Твой план искать незавершённую транзакцию в данном случае бесполезен и только тратит зря время. В сообщении 22397414 я написал, что я проделал и почему сделал вывод, что транзакция именно в моем приложении. Пока не будет доказано обратное, считаю за аксиому, что изменения, послужившие причиной блокировки, сделаны в моем приложении (как вариант, в функции из dll, вызванной из моего приложения. Dimitry Sibiryakov Надо сделать так чтобы этот конкретный известный тебе запрос перестал вызывать конфликты обновления. То есть либо его устранить совсем, либо превратить в INSERT. Давайте я немного расскажу про выполняемый код. Это все -- проведение документа. В процессе проведения выполняются всякие содержательные проверки, расчеты и т.п. На каждом этапе что-то изменяется в таблице: пересчитывается сумма, обновляется дата, меняются флажки, обозначающие какое-то изменение состояния и т.п. Цепочка действий может быть ветвистой, некоторые этапы могу выглядеть по-разному, некоторые -- вообще отсутствовать, но в любом случае -- это последовательность изменений. И каждое из них, по логике, выполняется в короткой транзакции, которая явно стартует и явно завершается. Если на каком-то этапе ХП вернула ошибку, то есть этап выполнился некорректно, соответствующая транзакция откатывается и на этом дальнейшее проведение прекращается. Тот UPDATE, на котором я ловлю конфликт, всего лишь выставляет битовый признак, означающий что документ распечатан. Я не могу заменить UPDATE на INSERT: мне надо в конкретной записи в конкретном поле значение поменять. Если я выполню этот UPDATE в рамках предыдущей транзакции, а она откатится, то ничего страшного: если бы она завершилась по ROLLBACK вовремя, то мой запрос UPDATE вообще не выполнялся бы. Как-то так. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:11 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJТот UPDATE, на котором я ловлю конфликт, всего лишь выставляет битовый признак, означающий что документ распечатан. Я не могу заменить UPDATE на INSERT: мне надо в конкретной записи в конкретном поле значение поменять. Можешь и должен. Выкинуть нафиг этот битовый признак, вместо него добавлять запись "документ распечатан" в историю операций над документом. Повторять так для каждой операции, которая наткнётся на конфликт. Другого пути - нет. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:19 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov GJТот UPDATE, на котором я ловлю конфликт, всего лишь выставляет битовый признак, означающий что документ распечатан. Я не могу заменить UPDATE на INSERT: мне надо в конкретной записи в конкретном поле значение поменять. Можешь и должен. Выкинуть нафиг этот битовый признак, вместо него добавлять запись "документ распечатан" в историю операций над документом. Повторять так для каждой операции, которая наткнётся на конфликт. Другого пути - нет. Вот здесь у меня непонятки. Допустим, я найду место, куда можно добавить информацию, что документ распечатан. Допустим даже, что я найду в своем приложении все места, где используется поле из этой таблицы, и заменю на вызов записи из другой таблицы. Но мое приложение -- это часть системы. И мне никто не позволит изменять все систему только потому, что в одном приложении где-то допустили ляп и в одном случае из десяти тысяч возникает lock coflict при апдейте. Так что это годится как временная мера, но не как окончательное решение. Устранять же проблему придется по-любому. И нормальным способом. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:38 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJИ нормальным способом. Это и есть нормальный способ. Костыль для системы, которую ты не можешь поменять всю сразу: 1. Переименовать таблицу и убрать из неё поле, вызывающее конфликт. 2. Добавить таблицу истории операций. 3. Создать view с именем старой таблицы, выбирающий из новой таблицы и таблицы истории недостающие поля. 4. Создать триггера на этот view, которые анализируют изменения и либо изменяют новую таблицу, либо добавляют записи в таблицу истории операций. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:48 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ lock coflict при апдейте GJ И нормальным способом. GJ я ловлю конфликт, всего лишь выставляет битовый признак ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:52 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
ДС на кнопке обошел. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 18:53 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov Это и есть нормальный способ <...> Игрушка "Сапер" была доработана, но после доработки иногда стал возникать глюк. Разработчик не смог найти причину появления этого глюка, поэтому решил переписать kernel32.dll :) Не знаю, как обстоит дело у Microsoft, но у нас мне никто не позволит переделывать структуру БД только потому, что в одном из приложений допущен ляп, который я не могу локализовать и устранить. Ivan_Pisarevsky 2 юзера с апдейт запросами обязательно вызовут лок конфликт, это вопрос времени и частоты, не более. Не-а... данное приложение как раз и создано для создания и проведения документа. Причем один документ создается и проводится одним экземпляром приложения. Все остальные могут документ читать, но не изменять. * * * Сразу расставим палочки над t У меня есть возможность изменить код клиентского приложения, чтобы: 1. Найти, где у меня незавершенная транзакция, и завершить ее до выполнения UPDATE (оптимальный вариант). 2. Определить, что есть незавершенная программа и как-то обеспечить корректное выполнение UPDATE (принудительно закрыть предыдущую транзакцию; не стартовать новую транзакцию, а внести изменения в рамках уже имеющейся и.т.п.). ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 19:24 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ ошибка не систематическая и возникает редко ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 19:24 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJСразу расставим палочки над t У меня есть возможность изменить код клиентского приложения, чтобы: 1. Найти, где у меня незавершенная транзакция, и завершить ее до выполнения UPDATE (оптимальный вариант). 2. Определить, что есть незавершенная программа и как-то обеспечить корректное выполнение UPDATE (принудительно закрыть предыдущую транзакцию; не стартовать новую транзакцию, а внести изменения в рамках уже имеющейся и.т.п.). 3. Найти все места в приложении, где при данной операции изменяется данная таблица и свести их в один UPDATE чтобы он производился один раз за операцию. 4. Начать использовать явное управление транзакциями в данном приложении чтобы в нём вообще осталась всего одна транзакция на всю проводку документа. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 19:31 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
YuRock GJ ошибка не систематическая и возникает редко Поскольку только один клиент вносит изменения в документ, то случайность обусловлена не тем, что два человека одновременно решили внести правки, а проколом в работе с транзакциями. Что-то где-то поменяли в коде приложения, после чего стала иногда возникать такая вот ошибка. Условия возникновения ошибки также неизвестны. Если я смогу осмысленно воспроизвести ошибку, я тогда и с проблемой разберусь. Вот я и повторяю постоянно: где в какой момент что запросить у сервера либо у dbExpress, чтобы локализовать ошибку или хотя бы сократить пространство поиска. Dimitry Sibiryakov GJСразу расставим палочки над t У меня есть возможность изменить код клиентского приложения, чтобы: 1. Найти, где у меня незавершенная транзакция, и завершить ее до выполнения UPDATE (оптимальный вариант). 2. Определить, что есть незавершенная программа и как-то обеспечить корректное выполнение UPDATE (принудительно закрыть предыдущую транзакцию; не стартовать новую транзакцию, а внести изменения в рамках уже имеющейся и.т.п.). 3. Найти все места в приложении, где при данной операции изменяется данная таблица и свести их в один UPDATE чтобы он производился один раз за операцию. 4. Начать использовать явное управление транзакциями в данном приложении чтобы в нём вообще осталась всего одна транзакция на всю проводку документа. Дочка спрашивает у мамы: - Как правильно пишется "флякончик" или "флюкончик"? - Напиши "пизирек", - отвечает мама. :) Речь идет о кассовом чеке. Товар добавляется, удаляется, изменяется количество, меняются цены (включилась скидка при добавлении дисконтной карты), выполнили частичную оплату бонусами... как вы себе предлагаете выполнить это все в рамках одного апдейта? А если транзакция будет одна, то она может оказаться... э-э-э... очень долгой. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 19:46 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJРечь идет о кассовом чеке. Товар добавляется, удаляется, изменяется количество, меняются цены (включилась скидка при добавлении дисконтной карты), выполнили частичную оплату бонусами... как вы себе предлагаете выполнить это все в рамках одного апдейта? А если транзакция будет одна, то она может оказаться... э-э-э... очень долгой. А если их будет несколько, то в базу попадёт только половина чека. И что-то я не припомню чтобы пробитие чека в магазине занимало много времени. PS: В любом случае причины проблемы, способы её локализации и устранения все уже названы. Дальше - работать исключительно тебе. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 20:01 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ1. Найти, где у меня незавершенная транзакция, и завершить ее до выполнения UPDATE (оптимальный вариант). вы реально управляете транзакциями в dbexpress? 12388228 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 20:38 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ YuRock пропущено... Это всегда так при неожидаемых блокировках. Поскольку только один клиент вносит изменения в документ, то случайность обусловлена не тем, что два человека одновременно решили внести правки, а проколом в работе с транзакциями. Что-то где-то поменяли в коде приложения, после чего стала иногда возникать такая вот ошибка. Условия возникновения ошибки также неизвестны. Если я смогу осмысленно воспроизвести ошибку, я тогда и с проблемой разберусь. Вот я и повторяю постоянно: где в какой момент что запросить у сервера либо у dbExpress, чтобы локализовать ошибку или хотя бы сократить пространство поиска. Dimitry Sibiryakov пропущено... 3. Найти все места в приложении, где при данной операции изменяется данная таблица и свести их в один UPDATE чтобы он производился один раз за операцию. 4. Начать использовать явное управление транзакциями в данном приложении чтобы в нём вообще осталась всего одна транзакция на всю проводку документа. Дочка спрашивает у мамы: - Как правильно пишется "флякончик" или "флюкончик"? - Напиши "пизирек", - отвечает мама. :) Речь идет о кассовом чеке. Товар добавляется, удаляется, изменяется количество, меняются цены (включилась скидка при добавлении дисконтной карты), выполнили частичную оплату бонусами... как вы себе предлагаете выполнить это все в рамках одного апдейта? А если транзакция будет одна, то она может оказаться... э-э-э... очень долгой. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 22:57 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
kdv Ой, мамо, роди меня обратно... Это что, улучшенный гибрид BDE c MIDAS? Мичуринцы, нехорошая женщина... Убороли чесотку в носе ампутацией головы... Не надо на этом работать, это же ужос-ужос. Соболезную. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2021, 23:30 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Старый плюшевый мишка kdv Ой, мамо, роди меня обратно... Это что, улучшенный гибрид BDE c MIDAS? Мичуринцы, нехорошая женщина... Убороли чесотку в носе ампутацией головы... Не надо на этом работать, это же ужос-ужос. Соболезную. То ж древняя фича. Её как придумали, так и забросили сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 01:37 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ -- Ватсон, это был математик. -- Почему вы твак решили, Холмс?! -- Ватсон, это же элементарно! Он подумал прежде, чем ответить. Его ответ абсолютно правильный. Его ответ совершенно бесполезный. :) GJ Опять общие слова, что лучше быть богатым и здоровым, чем бедным и больным. GJ Игрушка "Сапер" была доработана, но после доработки иногда стал возникать глюк. Разработчик не смог найти причину появления этого глюка, поэтому решил переписать kernel32.dll :) GJ Дочка спрашивает у мамы: - Как правильно пишется "флякончик" или "флюкончик"? - Напиши "пизирек", - отвечает мама. а поциент упорот... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 06:11 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ, можно операцию апдейта попробовать повторить. В обработчике исключения выполнить роллбэк (чтобы не усугублять ситуацию). Затем показать диалог с двумя кнопками "Отмена" и "Повторить попытку". С соответствующей реакцией по каждому варианту. Если дело действительно в случайном и редком одновременном редактировании в многопользовательском режиме - может помочь. Ну, раз на кардинальные действия ты не желаешь идти. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 07:15 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Если очень хочется, можно: 1. Все без исключения апдейты этой таблицы (включая в триггерах и других процедураз) завернуть в процедуры; 2. Процедуры вида UPDATE; WHEN ... - и при исключении залогировать признак ошибки, ID записи, дату, имя пользователя, компьютера, экзешник и номер транзакции. Залогировать чз udf в файл или в автономной транзакции в базу. Так же еще можно логировать в эту же таблицу логов ID этой записи перед UPDATE. Чтобы видно было, кто, собственно, заблокировал, и на ком упало. Работы много, на пол дня. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 07:47 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJ Все остальные могут документ читать, но не изменять. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 12:04 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov В любом случае причины проблемы, способы её локализации и устранения все уже названы. Дальше - работать исключительно тебе. Причины проблемы, более-менее, очевидны. В качестве способа устранения предложен вариант в стиле лечения головной боли посредством гильотины. А вот про локализацию что-то особо не заметил. Или вы про трассировку? Тогда я уже объяснил, почему это неприменимо. Не знаете другого способа как определить запрос или несколько потенциальных запросов, которые могут вызвать блокировку? Так и скажите, буду сам думать. YuRock При сохранении кассового чека UPDATE-ы запрещены. Вот этого я не понял. Это вопрос или утверждение? Почему UPDATE-ы запрещены? Как изменять значения полей записи? Дегтярев Евгений а поциент упорот... На вопрос "Как выявить запрос, приводящий к блокировке (или незавершенную транзакцию), мне рекомендуют: 1. Писать программы хорошо, тогда таких проблем не будет. 2. Переписать систему "правильно" А упорот, конечно же, "поциент" Кстати, на другом форуме могли бы посоветовать еще и СУБД заменить на "нормальную" :) ъъъъъ Если дело действительно в случайном и редком одновременном редактировании в многопользовательском режиме - может помочь. В том то и дело, что тут, скорее всего, не одновременное редактирование в многопользовательском режиме, а ошибка в клиентском приложении, оставляющая незавершенной транзакцию. Либо какая-то транзакция выполняется асинхронно, и иногда не успевает завершиться. YuRock Если очень хочется, можно: 1. Все без исключения апдейты этой таблицы (включая в триггерах и других процедураз) завернуть в процедуры; 2. Процедуры вида UPDATE; WHEN ... - и при исключении залогировать признак ошибки, ID записи, дату, имя пользователя, компьютера, экзешник и номер транзакции. Залогировать чз udf в файл или в автономной транзакции в базу. Так же еще можно логировать в эту же таблицу логов ID этой записи перед UPDATE. Чтобы видно было, кто, собственно, заблокировал, и на ком упало. Работы много, на пол дня. А почему тогда логирование UPDATE на триггер не повесить? База большая, изменяться таблица может много откуда: запросами UPDATE, хранимыми процедурами, скриптами. Все места внесения изменений можем и не найти. Да и не позволит мне никто кардинально менять метаданные. Все изменения в метаданные должны вноситься только официальными обновлениями. Обосновать разработку такого обновления я не смогу. Но, опять же скажу, 95% за то, что есть косячок в клиентском приложении, и его надо бы найти А для этого хотя бы определить запрос, который заблокировал запись. Или несколько запросов, которые могли это сделать. И от этого уже плясать. Надо было задавать вопрос на форуме программистов на Delphi :) Вот такой запрос может мне помочь? Код: sql 1. 2. 3. 4. 5. 6.
где NNN -- ID транзакции, содержащей блокирующий запрос. Каков смысл поля MON$STATE, могу ли я в поисках интересующего меня запроса отфильтровывать записи по значению этого поля, так как они точно не при делах? [+] Ivan_Pisarevsky GJ Все остальные могут документ читать, но не изменять. Вы предполагаете, а я знаю, что этого нет. Точнее, что это не планировалось, так что если есть такое, то чей-то косяк. Но тогда мы нарывались бы на lock conflict в разных местах. А мы нарываемся в о дном и том же запросе UPDATE ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 12:06 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
GJНе знаете другого способа как определить запрос или несколько потенциальных запросов, которые могут вызвать блокировку? ну смотри - допустим, в софте произошла ошибка по блокировке UPDATE. Ты тут же бросаешься смотреть в mon$, кто там и что. Но пока ты делал снимок mon$, конкурирующая транзакция завершилась. Всё, концов не найти. А трассировка дедлоков по статье, которую я привел, запускается НАДОЛГО. Именно для того чтобы найти только deadlock. И тогда что-то еще можно найти. Так что, других вариантов нет. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 12:13 |
|
Firebird + fbExpress lock conflict
|
|||
---|---|---|---|
#18+
kdv GJНе знаете другого способа как определить запрос или несколько потенциальных запросов, которые могут вызвать блокировку? ну смотри - допустим, в софте произошла ошибка по блокировке UPDATE. Ты тут же бросаешься смотреть в mon$, кто там и что. Но пока ты делал снимок mon$, конкурирующая транзакция завершилась. Всё, концов не найти. А трассировка дедлоков по статье, которую я привел, запускается НАДОЛГО. Именно для того чтобы найти только deadlock. И тогда что-то еще можно найти. Так что, других вариантов нет. Про трассировку я и не возражал. Только тут такой нюанс, что клиентские компьютеры и сервера принадлежать не мне, а заказчику. А он может и не позволить изменять настройку серверов или запускать лишнее программное обеспечение на клиентских компьютерах. Поэтому приходиться крутиться. По крайней мере, запрос к mon$transactions блокируюущую транзакцию поймал. Будем надеяться, что и запрос к mon$statements не оплошает. Так как насчет mon$statements.mon$state? Могу ли я по значению этого поля определить те записи, которые заведомо не могут блокировать таблицу? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2021, 12:28 |
|
|
start [/forum/topic.php?fid=40&msg=40113007&tid=1559880]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
158ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
66ms |
get tp. blocked users: |
1ms |
others: | 15ms |
total: | 289ms |
0 / 0 |