我遇到这样的情况,可以说我有两项服务
AccountService
CustomerService
两者都通过@Transactional
进行了注解,并带有某些createXXX()
方法。
现在,从我的AccountController
可以说我有一个方法,我将首先调用createAccount()
,一旦我从createAccount()
取回了帐户ID,就可以调用{{1} }(要创建客户并从createCustomer()
上的Account
更新帐户ID)
如果由于某种原因Customer
失败,我将处于受污染的状态,其中createCustomer()
已被保留,但未创建Account
。
我应该用Customer
解决这个问题还是应该处理这种情况?
答案 0 :(得分:1)
Spring事务默认使用REQUIRES传播级别(请参阅org.springframework.transaction.annotation.Transactional#propagation)。这意味着,除非存在现有事务,否则Spring不会创建新事务。使用此功能:您可以使用@Transactional
注释控制器的方法,也可以创建将触发顶级事务的新服务。这个想法是,一旦您创建了一个事务,服务调用就不会创建新的事务。结果,您只有一个可以成功提交或失败的事务。