【发布时间】:2016-03-29 22:08:18
【问题描述】:
我想在 PosgreSql 中通过 java 实现以下场景:
- 用户选择数据
- 用户启动事务:插入、更新、删除数据
- 用户提交事务
我希望在交易期间其他用户无法使用数据。如果当其他用户尝试更新表时我得到一个异常就足够了。
我尝试使用select for update 或select for share,但它也会锁定数据以供读取。我尝试使用lock 命令,但我无法获得锁 (ERROR: could not obtain lock on relation "fppo10") 或其他事务在尝试提交事务时获得锁,而不是在更新数据时。
是否存在一种在事务开始时锁定数据的方法,以防止对update、insert 或delete 语句的任何其他调用?
这个场景在 DB2 数据库上成功运行了几年。现在我需要同样的应用程序来为 PostgreSql 工作。
【问题讨论】:
-
一方面,您说您希望数据在交易期间不可供他人使用。另一方面,您不喜欢
select for update锁定数据以供阅读,在我看来,这显然是“对其他人不可用”。没有锁会阻止其他客户端尝试执行更新语句;有些种类会让他们等待。你真正想要什么? -
@Mike Sherrill'Cat Recall' 问题是,我不知道用户是否想在调用 select 语句的那一刻更新数据。任何更新后都清楚。但为时已晚。
-
你无法知道其他用户想要做什么。阅读PostgreSQL transaction isolation levels。
-
@Mike Sherrill 'Cat Recall' 我读过。我在 db2 上有工作应用程序。现在我希望这个应用程序在 postgre 上以同样的方式工作。但这似乎是不可能的:(。
-
根据您的 DB2 版本,如果行已被锁定以进行更新,则游标稳定性(又名已提交读)将返回单元格的 prior 值。也就是说,它的行为就像在更新语句发生之前读取并返回了该行,即使实际情况并非如此。因此,即使是您的 DB2 应用程序也可能没有按照您的预期进行。 IOW,这个想法是“修复您的应用程序以在并发环境中工作”。
标签: java postgresql jdbc transactions db2