【发布时间】:2018-03-19 00:12:40
【问题描述】:
前段时间我遇到了竞争条件问题,当 2 个单独的事务尝试同时检查记录是否存在(通过 4 个字段),如果不存在 - 创建一个新的。
我的环境:
MS SQL Server, Spring Data/JPA/Hibernate
这是重复记录问题。我实现了模拟并发调用的测试,因此能够(在 99.99% 的执行时间相当稳定)重现此问题。
现在我通过对这 4 个字段应用唯一约束来解决此问题。目前我的测试无法重现此问题。我对它真的很满意,但老实说,我并不完全理解它是如何工作的。这正是我创建这个问题的原因——我不明白为什么我的测试没有失败并出现ConstraintViolationException,而两个并发事务同时检查记录的存在,然后尝试创建它(每个) .根据我的测试,我的理解是 - 两个事务同时工作,并且在第一次检查期间不应该找到任何记录。之后,他们应该尝试创建新记录,其中一个事务应该能够做到,而另一个事务应该失败并显示ConstraintViolationException。但是代码运行良好,一切正常,没有任何异常。
在 Spring Data/JPA/Hibernate 级别甚至 MS SQL Server 是否有任何内部同步机制可以防止并发事务不正确工作并允许它们彼此等待工作结果?请解释。谢谢!
【问题讨论】:
标签: sql-server hibernate jpa transactions spring-transactions