**已关闭。**此问题需要debugging details。当前不接受答案。
编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
上个月关门了。
Improve this question
我有两个Spring应用程序的示例,其中有一个带有 @Transactional 注解的方法。该方法接收一个值,并检查数据库中是否有一行带有此值,如果不存在,则简单地插入。
当我用一个新值触发对这个方法的4个并发调用时,我希望只看到1行被插入到DB中。但是,我观察到有1到3行被插入。
如何避免插入多个记录?
2条答案
按热度按时间unhi4e5o1#
如何避免插入多个记录?
我会把一个独特的约束放在table上。他们正是为了这个目的而存在的,是可靠的,并为性能调整了几十年。
如果你坚持使用
@Transactional
,你会想把隔离级别设置为SERIALIZABLE
。我不确定所有的数据库都支持这个,所以一定要做一些测试。这对吞吐量有严格的限制,因为这几乎意味着在任何给定的时间,一次只能处理一个事务。最后,我不确定它如何与其他隔离级别的事务交互。bxjv4tth2#
我想你有并发问题,在阅读的时候。线程在同一时刻得到了一个关于不存在行的信息。在我看来你需要同步这个方法。