如何使用jdbc模板在Spring应用程序中进行并发隔离

我正在使用spring和jdbctemplate。 (不休眠)。我的桌子上有状态。

如果状态为OPEN,则可以将其关闭,并将执行某些处理。但是只能关闭一次。

现在我有一种情况,多个线程或请求可以进入同一代码块,在此我检查行的状态。

T data = getJdbcTemplate().query()...
// Multiple request/threads can come here at same point. 
if ( data.getStatus() == "OPEN"){
   // business logic
}

如何处理这种情况?

tangjw08 回答:如何使用jdbc模板在Spring应用程序中进行并发隔离

如果您使用的是mysql或pgsql之类的东西,则可以执行以下操作:

   UPDATE table WHERE id="id" AND status = "OPEN"

并检查受影响的行数(来自JdbcTemplate.upate())。例如,mysql和mariadb保证此更新仅发生一次。第二个并发线程将收到零个更新的行。

然后,您可以进行处理。


编辑:

此行为是RDMS保证的一部分(例如,参见https://en.wikipedia.org/wiki/ACID

另外,如果您要徘徊处理失败时发生的情况-我通常使用的模式是将状态设置为“待处理”,还可以在其中设置日期,如果卡住了则重置状态在“待处理”上的时间过长。当然,可以根据需要将其修改为标记为通过某种手动检查。

本文链接:https://www.f2er.com/3165730.html

大家都在问