【问题标题】:Firebird lock table / lock record火鸟锁表/锁记录
【发布时间】:2014-08-07 06:35:23
【问题描述】:

假设您有一个桌面应用程序和多个用户的表。 当用户打开记​​录时,我想锁定该记录。我试过“WITH LOCK”语句。它工作正常。 但是当第二个用户想要更新相同的记录时,我想输入一条消息“对不起,您无法处理此订单,因为它已被锁定。其他人在您之前打开了此记录”。 Firebird 等待第一个用户提交/回滚。我不想等待。我想输入一条错误消息。有没有简单的方法来询问firebird记录锁定状态?

有没有办法锁定一个完整的表?或者放置一个信号量/互斥锁(如 mysql 上的 get_lock) 我曾尝试在设置交易声明上保留,但它不起作用。 我的愿望是向用户显示一条消息。不等。

谢谢

【问题讨论】:

    标签: locking firebird


    【解决方案1】:

    如果您不想等待,请将您的事务配置为使用NO WAIT,或等待超时。然而,通过数据库事务来控制这样的业务规则是不可取的,因为它需要长时间运行的事务,这会抑制垃圾收集,增加感兴趣的事务链,并增加更新冲突的机会。

    我建议使用不同的选项,例如:

    • 先更新获胜
    • 更改检测(例如,通过时间戳或记录版本计数器,这也用作更新语句中的条件),并允许用户覆盖或放弃他的更新(或可能合并)
    • 通过在单独的事务中更新记录(设置用户名)来显式保留。这可能需要清理或用户能够中断预订(例如,如果有人将其打开时间过长)。

    请注意,Firebird 使用多版本并发控制 (MVCC),因此显式锁定并不是很自然。另见answer to Locking tables firebird, delphi

    应该可以使用RESERVING 锁定表,但我从未使用过它,所以我不完全确定如何使用它,尽管您可能还需要指定FOR PROTECTED READ(请参阅Interbase 6.0 Embedded SQL Guide,第 70 页/71)。

    【讨论】:

    • 我想我犯了一个错误。我想知道的是如何让firebird告诉我记录是否被锁定。
    • @testpresta 除了尝试使用 readcommitted no_rec_version 和无等待事务来查询记录之外,没有其他办法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 1970-01-01
    相关资源
    最近更新 更多