如何在应用程序级别处理MySQL死锁情况?
当MySQL / InnoDB中发生死锁情况时,它会返回以下熟悉的错误:
“试图锁定时发现死锁;尝试重新启动交易'
因此,我所做的是记录进入事务的所有查询,以便在事务中的语句失败时可以简单地重新发出它们。简单。
问题:当您的查询依赖于先前查询的结果时,这不能很好地工作。
例如:
START TRANSACTION;
INSERT INTO some_table ...;
-- Application here gets ID of thing inserted: $id = $database->LastInsertedID()
INSERT INTO some_other_table (id,data) VALUES ($id,'foo');
COMMIT;
在这种情况下,我不能简单地重新发布事务,因为它是最初创建的。事务失败后,第一个 SQL 语句获取的 ID 不再有效,但第二个语句使用。同时,许多对象已经填充了来自事务的数据,当事务回滚时,这些数据就会过时。当然,应用程序代码本身不会与数据库一起“回滚”。
问题是:如何在应用程序代码中处理这些情况?(菲律宾比索)
我假设两件事。如果您认为我走在正确的轨道上,请告诉我:
1)由于数据库不能在所有情况下逐字重新发出事务,因此我的原始解决方案不起作用,不应使用。
2)执行此操作的唯一好方法是将任何和所有事务发布代码包装在它自己的try/catch块中,并尝试重新发布代码本身,而不仅仅是SQL。
感谢您的输入。你真棒。