Firebird锁表/锁记录

时间:2014-08-07 06:35:24

标签: locking firebird

假设您有一个用于桌面应用程序的表和多个用户。 当用户打开记​​录时,我想锁定此记录。我试过" WITH LOCK"声明。它工作正常。 但是当第二个用户想要更新同一条记录时,我想发一条消息"抱歉,您无法处理此订单,因为它已被锁定。有人在你之前打开了这张唱片。 Firebird等待第一个用户提交/回滚。我不想等。我想提出一条错误信息。有没有一种简单的方法来询问火鸟记录锁定状态?

有没有办法锁定一张完整的桌子?或者放一个信号量/互斥量(比如mysql上的get_lock) 我已经尝试保留set事务声明,但它不起作用。 我的愿望是向用户显示一条消息。不等了。

由于

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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