如何使用hibernate和postrgresql在多个程序实例之间锁定记录?

时间:2013-09-30 13:29:55

标签: java hibernate postgresql jpa postgresql-9.2

我想找到一种方法来锁定来自实例A的记录,以便实例B可以知道该记录被锁定。

以下是GUI的工作原理:

在实例A上,用户要求修改实体E.程序检查某事(尝试保留令牌?还有别的东西?...)并显示修改对话框如果E是免费的。

假设实例A能够保留 E,而实例B想要打开同一个窗口。 B尝试锁定记录(尚未找到解决方案),因为A已经存在,B只显示咨询对话框。

我正在使用:

  • 的java
  • 每个实例上的休眠
  • postgresql(也许我可以使用锁定行为?)

注意:我只想锁定一张表的记录,而不是整个表。

有人可以给我一些关于使用内容的提示吗?如果实例A崩溃,也可以告诉我如何管理解锁保护?

提前致谢。

1 个答案:

答案 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没有意识到客户端已经足够快,你总是可以直接在数据库上终止该事务。