我正在使用 spring 和 jdbctemplate。 (没有 hibernate )。我有一个带有状态的表。
如果状态为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”之类的内容,也可能在那里设置一个日期,并在卡住时重置状态“待处理”时间太长。当然,如果需要的话,可以将其修改为标记为进行某种手动检查。
关于java - 如何使用 jdbc 模板在 Spring 应用程序中进行并发隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58696127/