首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >火鸟锁表/锁记录

火鸟锁表/锁记录
EN

Stack Overflow用户
提问于 2014-08-07 06:35:23
回答 1查看 4K关注 0票数 0

假设您有一个用于桌面应用程序的表和几个用户。当用户打开记录时,我希望锁定此记录。我试过“用锁”的说法。效果很好。但是,当第二个用户想要更新同一记录时,我想要写一条消息:“对不起,您不能处理此订单,因为它已被锁定。其他人已经在您之前打开了此记录”。Firebird等待第一个提交/回滚的用户。我不想等。我想写一条错误信息。是否有一种简单的方法来询问firebird记录锁定状态?

有办法锁满桌子吗?或者,为了放置一个信号量/互斥(就像mysql上的get_lock ),我尝试保留set事务语句,但它不起作用。我的愿望是向用户显示一条消息。而不是等待。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2014-08-07 07:28:28

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

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

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

请注意,Firebird使用多版本并发控制(MVCC),因此显式锁定并不是很自然的。也请参阅这个answer to

使用RESERVING锁定表应该是可能的,但我从未使用过它,因此我不完全确定如何使用它,尽管您可能还需要指定FOR PROTECTED READ (参见InterBase6.0嵌入式SQL,第70/71页)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25175679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档