【问题标题】:Explicit lock on a given row with MySQL使用 MySQL 显式锁定给定行
【发布时间】:2013-07-12 18:03:52
【问题描述】:

是否可以使用 MySQL 在给定行上获得显式、独立的锁定?

我想要的是:

  • 读取一行,并在其上获取锁;如果该行已经被锁定,则等待锁定被释放
  • 执行一些处理
  • 写入行,然后释放锁

我认为SELECT FOR UPDATE 会是我的解决方案,但因为它需要显式事务,所以我无法执行以下操作:

  1. 读取并锁定第 1 行
  2. 读取并锁定第 2 行
  3. 做点什么……
  4. 写入并发布第 2 行
  5. 做点什么……
  6. 写入并发布第 1 行

(或颠倒第 4 步和第 6 步。)

基本上,我希望能够在任何时候显式地获取和释放任何行上的锁,而不必等待使用COMMIT 同时释放所有锁。因此产生了无需交易的想法。

这可以通过 MySQL 实现吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    使用两个事务(跨两个数据库连接);否则,use triggers to make your records read-only

    【讨论】:

    • 我试图避免使用与锁定记录一样多的连接,不幸的是,触发器不会提供故障转移,以防进程在没有解锁记录的情况下死亡!
    • 这很有趣,因为在使用文件系统时这似乎很容易(锁定任何文件,随时解锁,并且在文件关闭时释放故障转移锁定),但看起来用数据库复制它相当复杂!
    • @Benjamin:通常人们会尽量缩短交易时间,因此第 4 步和第 6 步之间的时间是如此无关紧要,以至于这类细节并不重要。需要这么长时间的第 5 步到底发生了什么?真的有必要释放第一个锁并一直持有第二个锁吗?
    • 实际上我无法真正控制何时提交事务:这将用作会话后端存储,我需要能够仅在当前控制器中使用的会话部分(而不是锁定整个会话)。理想情况下,每个会话“密钥”都可以随时加载和锁定,并应尽快释放;但是会话的消费者不应该知道幕后发生的事情。数据库只是可用的后端存储之一:使用文件后端,一切都变得更容易。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 1970-01-01
    • 2012-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多