我正在使用spring和jdbctemplate。 (不休眠)。我的桌子上有状态。
如果状态为OPEN,则可以将其关闭,并将进行某些处理。但是只能关闭一次。
现在,我有一种情况,即多个线程或请求可以进入同一代码块,在此我检查行的状态。
T data = getJdbcTemplate().query()...
// Multiple request/threads can come here at same point.
if ( data.getStatus() == "OPEN"){
// business logic
}
我该如何处理这种情况?
如果您使用的是mysql或pgsql之类的东西,则可以这样做:
UPDATE table WHERE id="id" AND status = "OPEN"
并检查受影响的行数(来自JdbcTemplate.upate())。例如,mysql和mariadb保证此更新仅发生一次。第二个并发线程将收到零个更新的行。
然后,您可以进行处理。
编辑:
此行为是RDMS保证的一部分(例如,参见https://en.wikipedia.org/wiki/ACID)
[另外,如果您在处理失败时徘徊,我通常使用的模式是将状态设置为“ PENDING”,也可以在其中设置日期,如果卡在上面则重置状态“待处理”过长。当然,可以根据需要将其修改为标记为进行某种手动检查。