我想找到一种方法来锁定来自实例A的记录,以便实例B可以知道该记录被锁定。
以下是GUI的工作原理:
在实例A上,用户要求修改实体E.程序检查某事(尝试保留令牌?还有别的东西?...)并显示修改对话框如果E是免费的。
假设实例A能够保留 E,而实例B想要打开同一个窗口。 B尝试锁定记录(尚未找到解决方案),因为A已经存在,B只显示咨询对话框。
我正在使用:
注意:我只想锁定一张表的记录,而不是整个表。
有人可以给我一些关于使用内容的提示吗?如果实例A崩溃,也可以告诉我如何管理解锁保护?
提前致谢。
答案 0 :(得分:1)
我很确定你想要的是select for update
。这将锁定该行,防止您的其他事务写入或获取写锁定。问题是,当另一个交易尝试select for update
时会发生什么。我不确定它是否会立即阻止或抛出异常。你应该试一试。
Hibernate:http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html第11.4节 Postgress:http://www.postgresql.org/docs/9.1/static/explicit-locking.html
使用此解决方案,您不必担心失效锁定,因为如果您的应用程序崩溃,事务将关闭并且锁定将被释放。如果DBMS没有意识到客户端已经足够快,你总是可以直接在数据库上终止该事务。