Java 我们可以一起选择和更新数据库吗?
我有一个逻辑,可以从数据库中选择一些状态为“就绪”的行 一旦得到结果集,我需要将状态更新为“processing”,这样其他线程就无法访问这些行。然后我必须对结果集中的记录执行一些逻辑,一旦处理完成,我需要再次将记录状态更新为completed 问题: 当我执行select语句时,有没有一种方法可以同时更改结果集中返回的行的状态Java 我们可以一起选择和更新数据库吗?,java,postgresql,Java,Postgresql,我有一个逻辑,可以从数据库中选择一些状态为“就绪”的行 一旦得到结果集,我需要将状态更新为“processing”,这样其他线程就无法访问这些行。然后我必须对结果集中的记录执行一些逻辑,一旦处理完成,我需要再次将记录状态更新为completed 问题: 当我执行select语句时,有没有一种方法可以同时更改结果集中返回的行的状态 是否有人可以建议是否有一种在java中实现它的好方法。您可能正在寻找允许您自己锁定表/行的“锁”。PostgreSQL网站上有一个很好的例子: 使用锁将确保只有您有权
是否有人可以建议是否有一种在java中实现它的好方法。您可能正在寻找允许您自己锁定表/行的“锁”。PostgreSQL网站上有一个很好的例子:
使用锁将确保只有您有权访问表/行,其他人只有在您完成后才能访问。您可以
选择。。。对于事务中的UPDATE NOWAIT
,在更新行之前要处理的行<代码>选择。。。对于SHARE NOWAIT,如果有人正在更新所选行或有人已更新所选行,则AIT将失败并出错。SELECT。。。用于在其上共享NOWAIT
详细信息。回答你的主要问题:是的,你可以做到
SERIALIZABLE
事务,将需要在应用程序端进行更改,因为这些隔离级别假定有一定数量的事务将由于序列化错误而回滚,这是一种正常和预期的行为
此外,更严格的隔离级别(以及更多的SELECT…FOR UPDATE
查询)将导致性能下降,并可能导致竞争条件,具体取决于设计这将是一个数据库特性,而不是编程语言。尽管如此,您仍然可以在Java(或其他PL)中创建一个函数来处理
UPDATE
和SELECT
语句来解决您的问题。另一个解决方案可能是创建一个同时执行UPDATE
和SELECT
语句的存储过程,然后使用Java中的CallableStatement
执行该过程。我不确定您想要做什么,但PostgreSQL还具有SELECT FOR UPDATE
功能,该功能将选择行并在其上创建访问锁:锁定整个表可能是个坏主意。在这种情况下,行级锁更好。