2013-10-31 221 views
1

我对如何处理innodb死锁有点困惑。这里的acommon情景我已经在网上查到:在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失败,不应该我只是reapeat该查询,而不是回滚整个事务,只有X之后,回滚尝试?
  • 问题2:没有任何额外的隔离指令(即SELECT * FROM table WHERE smth = smth)是否会进入死锁?

回答

1

Answer 1

事务僵局让InnoDB 回滚整个事务。发生这种情况时重试整个事务。

答2:

No如果事务隔离水平比SERIALIZABLE降低(或者如果事务之外运行):

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

是如果SERIALIZABLE

对于SERIALIZABLE水平,共享的next-key锁定在它遇到的索引记录搜索集。

Remember that

通常情况下,让他们随时准备重新发行,如果它被推出,因为死锁的回退的事务必须编写你的应用程序。

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

+0

谢谢你解释 – Marius