在MySQL中对锁的获取方式进行排序



来自MySQL文档:

锁定读取、UPDATE或DELETE通常会对SQL语句处理过程中扫描的每个索引记录设置记录锁定。语句中是否存在将排除该行的WHERE条件并不重要。InnoDB不记得确切的WHERE条件,但只知道扫描了哪些索引范围

当我执行UPDATE时(尽管我也会对其他语句感兴趣,但现在我关心的是UPDATE语句),有没有一种方法可以按照相同的顺序放置锁,从而尽可能避免死锁?

如果在使用INNER JOIN(或多个表)执行UPDATE时可以这样做,我也会非常感兴趣。

注意:由于并发更新和插入(甚至删除),我的表中会出现死锁。

您可以使用select for update语句锁定所有行:

start transaction;
--lock all needed data to be sure avoid deadlocks:
select 1 from table_1 where condition_1 for update;
select 1 from table_2 where condition_2 for update;
select 1 from table_3 where condition_3 for update;
--do updates
update in any order you want
--commit
commit;

在mysql死锁视频中,您可以看到在第一部分用户如何引发死锁:

  1. 用户用2个事务打开2个会话
  2. 用户在第一个会话中更新表t1,在第二个会话中升级表t2
  3. 用户尝试扭曲更新:他在第一个会话上更新t2,在第二个会话中更新t1
  4. 出现死锁

在第二部分中,用户在更新和。。。(损坏的已移除;)

最新更新