2

我对如何处理 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 table WHERE smth=smth)是否会陷入死锁?
4

1 回答 1

1

答案 1

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

答案 2:

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

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

是的,如果SERIALIZABLE

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

请记住

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

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

于 2013-11-05T12:48:03.963 回答