1

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

以下是 GUI 的工作方式:

在实例 A 上,用户要求修改实体 E。程序检查某些内容(尝试保留令牌?其他内容?...),如果 E 空闲,则显示修改对话框。

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

我在用 :

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

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

有人可以给我一个关于使用什么的提示,也许还可以告诉我如果实例 A 崩溃,我如何管理解锁保护?

提前致谢。

4

1 回答 1

1

我很确定你想要的是一个select for update. 这将锁定该行,防止您的其他事务对其进行写入或获得写入锁定。问题是,当另一个事务也尝试 a 时会发生什么select for update。我不确定它是否会立即阻止或抛出异常。你应该试试看。

休眠: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 没有意识到客户端的运行速度不够快,您总是可以直接在数据库上终止该事务。

于 2013-10-01T00:31:03.843 回答