请教Spring事务管理的问题? 400 报错 大家好
我想请教一个关于spring的事务管理的问题:
<!--事务通知--> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
<aop:config proxy-target-class="true"> <aop:pointcut id="serviceMethod" expression="execution(* com.mtea.mis.service.Service.(..))" /> <!-- 通知器引用通知,切入点 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /> </aop:config>
public void updateAnyWithTrans() { try { UserType oldUserType=userTypeMapper.findById(1); oldUserType.setRemark("第6次remark"); userTypeMapper.update(oldUserType); oldUserType.setRemark("第7次remark"); userTypeMapper.update(oldUserType); throw new RuntimeException("测试异常"); } catch (Exception e) { e.printStackTrace(); System.err.println("出错了"); } }
这个问题不知道你是如何处理的啊 ?因此我想请教一下!!!
是不是我什么地方处理不好,或者思想上没有觉悟?还盼多赐教.
catch住了也可以继续抛
catcg{
throw new ***Exception();
}
######catch住了也可以继续抛
catcg{
throw new ***Exception();
}
那也就是说catch住了之后再包装成RuntimeException,然后再外抛.这样既在catch中做了日志记录,然后又能回滚事务!
但是,请问你做项目也是这么干的吗,我想知道大家通用的做法?我怕自己的做法不正确!
如果catch后,向数据库插入日志后再throw出去,岂不是刚插的日志也回滚了?结果数据库记录恢复原状,日志也是原状。抱歉,我没亲自试过。
一种可能方法是catch里先调用一个JMS,然后再throw出去,在接收JMS的MDB(MessageDrivenBean)里向数据库插入日志记录。这样,try-catch在第一个事务里,会回滚;MDB在第二个事务里,不回滚。抱歉,这个我也没亲自试过。
######我们的日志不是直接保存到数据库,而是向另一个专门处理日志的项目发送一条请求,由那个项目把数据插入数据库。######Spring中事务配置有三种方法。
1. 粗颗粒度,如楼主所用的,比较难找出问题,往往不能适应所有的情况。
2. 颗粒度适中的,使用 @Transcational,在方法和类上使用。
3. 细颗度的,使用 TransactionTemplate,可以控制到代码块的事务。
最新的项目中,只使用 2, 和 少量的 3,绝对不会使用 1.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。