Я использую UniDAC (Devart) в 2 приложениях, обращающихся к базе данных MySQL. Во время некоторых крупных операций обновления обновлений, выполненных одним приложением, иногда я получаю сообщение об ошибке «# 40001« Тупик », обнаруженный при попытке блокировки, попробуйте перезапустить транзакцию» в другой. Прочитав советы MySQL, чтобы справиться с этим, они говорят, чтобы повторить транзакцию. Мой вопрос состоит в том, чтобы узнать, как это сделать в Delphi. Я делаю это:Избегайте взаимоблокировок MySQL/UniDAC/Delphi
transaction_completed_ok:= False;
repeat
try
my_db.StartTransaction;
(... do the inserts)
my_db.Commit;
transaction_completed_ok:= True;
except
my_db.Rollback;
Sleep(1000);
end;
until transaction_completed_ok;
Doing это каждую сделку, на обоих приложениях, является верным способом для решения проблемы? Может ли кто-нибудь поделиться наилучшим образом? Любая помощь приветствуется.
Нет необходимости 'Sleep()', так как замки уже были приобретены конкурирующей сделки, и поэтому сразу же повторить попытку это один заставит его ждать на получение блокировки, а не тупик. Кроме того, вы, вероятно, захотите проверить причину, по которой транзакция завершилась неудачно, так как вы, вероятно, захотите обработать условия, отличные от тупика, по-разному. – eggyal