我对如何处理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 回答
Answer 1:
答案2:
No如果事务隔离级别低于
SERIALIZABLE
(或者如果在事务之外运行):是的,如果
SERIALIZABLE
:Remember that
SELECT
也可能只是超时,等待来自另一个事务(例如表锁)的锁定 .