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

时间:2013-10-31 07:14:09

标签: mysql innodb deadlock

我对如何处理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:假设查询2 失败,我不应该简单地重新考虑该查询而不是回滚整个事务并且只在X次尝试后回滚吗?
  • 问题2:没有任何额外的隔离指令(即SELECT * FROM表WHERE smth = smth)的简单选择是否会陷入死锁?

1 个答案:

答案 0 :(得分:1)

Answer 1

  

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

答案2:

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

No

  除非事务隔离级别设置为SELECT ... FROM,否则

SERIALIZABLE是一致的读取,读取数据库的快照和设置无锁

SERIALIZABLE

  

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

Remember that

  

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

SELECT也可能只是超时,等待来自其他交易的锁(例如表锁)。