在InnoDB中发生死锁后重复事务

我对如何处理innodb中的死锁感到困惑 . 这是我在网上找到的常见情景:

while (some deadlock condition)
{
    try {
        begin transaction
        query 1
        query 2 // let's assume this one failed with a deadlock
        ...
        query N
        commit
    }
    catch {
        make sure it's a deadlock AND
        rollback
    }   
}
  • 问题1:假设 query 2 失败,我不应该简单地重新考虑该查询而不是回滚整个事务并且只在X次尝试后回滚吗?

  • 问题2:没有任何额外的隔离指令(即SELECT * FROM表WHERE smth = smth)的简单选择是否会陷入死锁?

回答(1)

2 years ago

Answer 1

事务死锁导致InnoDB回滚整个事务 . 发生这种情况时重试整个事务 .

答案2:

No如果事务隔离级别低于 SERIALIZABLE (或者如果在事务之外运行):

SELECT ... FROM是一致读取,读取数据库的快照并设置无锁,除非事务隔离级别设置为SERIALIZABLE .

是的,如果 SERIALIZABLE

对于SERIALIZABLE级别,搜索会在遇到的索引记录上设置共享的下一键锁定 .

Remember that

通常,您必须编写应用程序,以便在由于死锁而回滚时,它们始终准备重新发出事务 .

SELECT 也可能只是超时,等待来自另一个事务(例如表锁)的锁定 .