gpt4 book ai didi

共享模式锁定和更新锁定之间的mysql中间地带?

转载 作者:行者123 更新时间:2023-11-29 00:52:13 25 4
gpt4 key购买 nike

我试图在锁定共享模式和锁定更新之间找到一个中间地带。

只要被修改的行还没有被更新,看起来共享模式的锁可以被两个不同的事务获取。这在以下情况下很糟糕:

  • t1 开始
  • X 上的 t1 读锁
  • t2 开始
  • X 上的 t2 读锁
  • t2 检查是否 X.foo == 0
  • t1 更新 X.foo = 1
  • t1 结束
  • t2 继续错误的逻辑,因为 X.foo != 0

我可以使用的替代方法是更新锁定,但这对我的应用程序来说限制太多,因为我不关心我的用户是否读取了 10 秒前的值。所以我永远不想使用锁进行更新。

问题:有没有我可以使用的锁:

  1. 独家
  2. 允许在不获取锁的情况下读取行

例子:

  • t1 my_lock 行 X
  • t2 my_lock 行 X => 不允许
  • t3 select row X => ALLOWED,返回最新提交的数据,如共享模式锁定

编辑:我使用 NDB 集群作为我的存储引擎。服务器版本:5.1.56-ndb-7.1.15a-cluster-gpl-log MySQL Cluster Server (GPL)

最佳答案

如果不进一步了解自己在做什么,就很难确切地知道要推荐什么。但这里有一些建议可能会帮助您找到答案。

首先,普通的 SELECT ... FROM ... 不会对 any 行进行any 锁定,并提供一个consistent 读取 -- 即它根据 SELECT 语句开始时数据库中的内容提供结果集。

了解这一点很重要,因为只有在以下情况下才会出现锁定问题:

  • 多个语句同时尝试更新相同的数据,或者
  • 出于某种原因,您希望在长 SELECT 语句中间完成的更新反射(reflect)在结果中。 (我不确定为什么这会有效。)

其次,为其他类型的语句(例如 SELECT ... FROM ... LOCK IN SHARE MODE)锁定的行将取决于用于选择要更新的行的索引.基本上,为定位行而扫描的索引的所有行都将被锁定。

这很关键,因为您可以通过制作索引来显着减少锁定的行数,这些索引允许您的 UPDATE 语句选择要直接更新的行。例如,如果您可以在表上创建一个 UNIQUE 索引,然后让 UPDATE 语句在运行更新时命中该 INDEX,则只会锁定该行。

因此,我解决锁定问题的最大运气是获取了这两条信息——1) 正常的 SELECTS 不进行任何锁定,以及 2) 我可以定义良好的索引以最小化需要的行实际上确实会被锁定——然后设计不会导致锁定冲突的 sql。

这是指向一个页面的链接,该页面总是帮助我解决我在锁定方面遇到的任何问题。它具体描述了每种生成锁的语句以及它们是什么类型的锁:Locks Set by Different SQL Statements in InnoDB

关于共享模式锁定和更新锁定之间的mysql中间地带?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7969096/

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