问题描述
我正在设法解决最初似乎是“简单”问题的问题。
我有UserAccounts
,可以有很多Purcahse
,但业务逻辑指示只能有一个Purchase
处于PurchaseState.IDLE
状态(实体上的字段)。第一次创建purchase
时是IDLE。
我有一个回购,其中提供一种方法来确定用户是否已在给定状态下购买商品:
boolean existsByPurchaseStateInAndUserAccount_Id(List<PurchaseState> purchaseState,long userAccountId);
我注意到,经过一些测试,我认为当两个请求同时接近(即并发问题和/或竞争条件)同时通过时,我可以创建多个购买。
这导致该用户帐户进行了两次购买,并且两次购买都具有IDLE状态。
现在,有没有一种方法可以使用@Transactional导致第二个持久性/事务回滚?
我不确定是否只是将服务方法包装在@Transcational(isolation=REPEATED_READ)
中
会缓解这个问题吗?即SQL有什么方法可以处理此事务?
我只能猜测这实际上并没有帮助,因为SQL事务未跟踪existBy,因此不会回滚吗?
如果存在> 1个符合条件的实体,是在方法末尾运行第二个countBy
查询以回滚事务的唯一实际解决方案吗?我仍然不认为这是“完美的”并完全解决了种族状况/ TX问题...
因此该服务将看到在两个事务中有2个实体已提交(尚未提交),但是对于T2,该服务可以抛出RuntimeException来触发回滚吗?
对不起,我一直在阅读有关事务隔离的信息,但这似乎仅适用于说是否正在检查实体的字段值/列,而不是使用基于“ count(*)返回”的逻辑“查询...
谢谢您的启发。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)