我在2个访问MySQL数据库的应用程序中使用UniDAC(Devart)。 在某个应用程序进行的某些繁重的更新更新操作中,偶尔会出现错误“尝试获取锁定时发现的#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;
这样做每一笔交易,在两个应用程序,是处理问题的一个有效方法是什么?任何人都可以分享最佳方式吗?欢迎任何帮助。
不需要'Sleep()',因为锁已经被竞争事务获得,因此立即重试这个锁将导致它等待获取锁而不是死锁。此外,您可能想检查事务失败的原因,因为您可能希望以不同的方式处理死锁以外的其他情况。 – eggyal