gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 23:41:50 24 4
gpt4 key购买 nike

来自 MySQL 文档:

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

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

如果在使用 INNER JOIN(或多个表)执行更新时可能的话,我也会非常感兴趣。

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

最佳答案

您可以使用 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 deadlock video您可以看到第一部分用户如何引发僵局:

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

在第二部分,用户在更新之前选择更新并...(已删除;)

关于mysql - 对 MySQL 中获取锁的方式进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34174109/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com