请教一下 Spring 部分事物回滚的问题

2019-06-19 11:41:27 +08:00
 ukipoi

一个类有 录入操作 和 更新操作。
在 录入操作 中会在返回结果之前进行一次 更新操作。
我现在希望的是 录入操作 不会被回滚掉但是更新操作进行回滚。
而且录入操作必须在更新操作之前,不然更新就没有对象了

@Autowired
private xxxDAO dao;
@Autowired
private xxxAPI api;

@Transactional
public void fun(XXX xxx,YYY yyy){
	/* do something */
	dao.save(xxx);//保存数据到数据库
	this.update(yyy);//更新一下数据库的数据(更新方法里会根据另一个模块的结果更新,先执行更新,如果另一个模块返回失败则要把更新的操作回滚掉)
}

@Transactional(propagation = Propagation.NESTED)
public void update(XXX xxx){
	/* do something */
	dao.update(xxx)
	if(!api.xxx){
		TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
		/* do something */
    }
}
1016 次点击
所在节点    问与答
2 条回复
zjp
2019-06-19 12:49:51 +08:00
update()要独立回滚,事务传播性得用 requires_new。但是这样又会有隔离性问题,read uncommit 的隔离级别估计不合适。
其实看起来 update()在 fun() 之后执行就能满足…
ukipoi
2019-06-19 13:02:22 +08:00
@zjp
是的,我在 controller 里先调用 save 方法在调用 update 方法就可以了。
不过出现这样的问题是设计问题还是其他问题?在正常业务中,所有出现我这样的问题的情况,都应该是在 controller 处理,还是有可能出现必须放在 save 方法中的情况?
还有一点,请问关于 spring 的事物这方面的内容,从哪里开始学习比较好,网上找资料的话总感觉一知半解,没有个开头切入点学习。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/575420

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX