【发布时间】:2019-04-28 02:14:38
【问题描述】:
所以,这似乎是一个非常菜鸟的问题,但经过一番谷歌搜索后,我找不到最好的方法。
问题:有一个 Spring-Boot 应用程序,与数据库 (MySQL) 交互。 考虑一个表 T1,我不希望每个用户只有一个有效条目。 因此,如果出现下一个条目,它会软删除(通过设置 deleted-at 列)该用户的现有行并创建一个新条目。 现在问题来了,几乎同时有多个请求。
我的事务块,看起来像这样:
@Transactional
someMethod() {
CheckIfAnyValidEntryForUser(U1);
SoftDeleteExistingEntries(U1);
DoComputation(); // Takes around a second.
InsertNewRow();
}
现在,如果在短时间内有多个请求,那么我的代码最终会为单个用户插入多个有效条目。
由于我要编辑的行以前可能不存在,所以我不能按版本号进行乐观锁定。
正在考虑在这个 someMethod 上获取全局锁定,但这会增加我的延迟太多。
另一种方法可能是在数据库中为列(包括 delete-at 列)使用复合唯一键。然后在代码中处理提交失败。
这似乎是一个很常见的问题,那么通常如何处理呢? 最好的方法是什么?
【问题讨论】:
标签: java mysql spring spring-boot spring-transactions