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