我有逻辑从数据库中选择一些状态为“就绪”的行,一旦我得到结果集,我需要将状态更新为“处理”,因此没有其他线程可以访问这些行。然后我必须对结果集中的记录执行一些逻辑,并且处理完成我需要再次将记录状态更新为已完成。
问题:当我执行 select 语句时,有没有一种方法 - 那时只有我可以同时更改结果集中返回的行的状态。
有人可以建议是否有在java中实现它的好方法。
我有逻辑从数据库中选择一些状态为“就绪”的行,一旦我得到结果集,我需要将状态更新为“处理”,因此没有其他线程可以访问这些行。然后我必须对结果集中的记录执行一些逻辑,并且处理完成我需要再次将记录状态更新为已完成。
问题:当我执行 select 语句时,有没有一种方法 - 那时只有我可以同时更改结果集中返回的行的状态。
有人可以建议是否有在java中实现它的好方法。
您可以SELECT ... FOR UPDATE NOWAIT
在事务中更新要处理的行,然后再更新它们。SELECT ... FOR SHARE NOWAIT
如果有人正在更新选定的行或有人已经SELECT ... FOR SHARE NOWAIT
对其进行了更新,则会失败并出现错误。
详情here
。
回答你的主要问题:是的,你可以做到!
正如其他人所提到的,SELECT … FOR UPDATE
这是您的选择之一。
另一个是增加序列化级别。请看一下这个相关的答案并点击那里的链接。
值得一提的是,达到REPEATABLE READ
甚至是SERIALIZABLE
事务都需要在应用程序端进行更改,因为这些隔离级别假定一定数量的事务将因序列化错误而回滚,这是正常且预期的行为。
此外,更严格的隔离级别(以及更多SELECT … FOR UPDATE
查询)将导致性能下降,并可能导致竞争条件,具体取决于设计。
请查看depesz.com 上的这篇文章,它很好地概述了相关领域可能存在的缺陷。
您可能正在寻找允许您锁定表/行(为自己)的“锁”。可以在 PostgreSQL 网站上找到一个很好的示例:
http://www.postgresql.org/docs/current/static/sql-lock.html
使用锁将确保只有您可以访问表/行,而其他人在您完成之前无法访问。