Java 在内部事务失败的情况下如何回滚外部事务,但内部事务应保存数据
试图防止内部事务回滚。若内部事务响应未成功,则外部事务应回滚,但内部事务应保存数据Java 在内部事务失败的情况下如何回滚外部事务,但内部事务应保存数据,java,spring,spring-transactions,Java,Spring,Spring Transactions,试图防止内部事务回滚。若内部事务响应未成功,则外部事务应回滚,但内部事务应保存数据 @Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW) private void test1(Account account) throws Exception { DOA.save(account); status = test2(account); if(status!='SUC
@Transactional(rollbackFor=Exception.class, propagation=Propagation.REQUIRES_NEW)
private void test1(Account account) throws Exception {
DOA.save(account);
status = test2(account);
if(status!='SUCCESS'){
throw new Exception("api call failed");
}
}
@Transactional(propagation=Propagation.MANDATORY)
private void test2(Account account) {
response //API Call
DOA.save(response);
return response.status;
}
将内部事务方法配置为
传播。需要\u NEW
,以便无论外部事务方法是否回滚,在方法完成时始终提交(即保存数据)
另外,确保外部方法不会自调用内部方法,因为@Transactional
在这种情况下不起作用(请参阅中的方法可见性和@Transactional部分)
它们应该位于不同的bean中,外部方法调用内部方法的bean:
@Service
public class Service1 {
@Autowired
private Service2 service2;
@Transactional(rollbackFor=Exception.class)
public void test1(Account account) throws Exception {
DOA.save(account);
status = service2.test2(account);
if(status!='SUCCESS'){
throw new Exception("Api call failed");
}
}
}
@Service
public class Service2{
@Transactional(propagation=Propagation.REQUIRES_NEW)
public void test2(Account account) {
response // API Call
DOA.save(response);
return response.status;
}
}
@Transactional
对于您的Test2
方法被忽略,并且调用是单个事务的一部分
Test2
方法启动新事务,这样它就不会影响Test1
启动的现有事务
但是在您的情况下,它不会启动新事务,即使您使Test2
public,因为它是从同一个类调用的
解决方案-
传播。需要\u NEW
@ USER 327 751高兴听到,所以考虑接受我的回答还是给我一个表决?