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

问题描述 投票:0回答:1

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

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

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

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

我该如何处理这种情况?

java spring concurrency jdbctemplate
1个回答
1
投票

如果您使用的是mysql或pgsql之类的东西,则可以这样做:

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

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

然后,您可以进行处理。


编辑:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.