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

标签 java spring concurrency jdbctemplate

我正在使用 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/

相关文章:

java - 如何沿y轴旋转图像?

java - 无法在 appium 中的 twitter LoginPage 上找到元素

java - java swing 中的非静态方法 getContentPane() 无法从静态上下文错误中引用

java - IO/网络绑定(bind) Fork/Join-Tasks

java - 多线程 : java condition await timeout but can't return

java - 为我的项目建议一个 Maven 存储库管理器

java - 创建名称为 'securityConfig' 的 bean 时出错 : Injection of autowired dependencies failed

java - Spring - 如何用外部文件覆盖内部配置文件

java - Jetty 服务器中项目部署期间发生 BeanCreationException

java - ConcurrentSkipListSet内部工作原理,与TreeSet的区别