spring aop 处理exception()

本文解析了Spring框架中事务处理不起作用的原因之一:未正确配置回滚的异常类型。具体讨论了checked exception与unchecked exception的区别及其对事务回滚的影响,并提供了两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在目前使用的现有框架当中,利用springAOP机制来控制事务处理是目前最流行的一种控制事务的方式。<o:p></o:p>

但是我们在某种使用场合的过程中,为什么有时事务处理老是不起作用呢?这里,为您道出原因之一,<o:p></o:p>

<o:p></o:p>

首先请看一段话<o:p></o:p>

Spring的事务实现采用基于AOP的拦截器来实现,如果没有在事务配置的时候注明回滚的checked exception,那么只有在发生了unchecked exception的时候,才会进行事务回滚。<o:p></o:p>

<o:p></o:p>

有必要先解释一下checked exceptionunchecked exception<o:p></o:p>

先看看EXCEPTIONJDK文档当中的结构<o:p></o:p>






Exception是作为checked Exception 出现的。<o:p></o:p>

有了以上的基础,看看我们框架当中的事务属性<o:p></o:p>

<property name="transactionAttributes"><o:p></o:p>

                     <props><o:p></o:p>

                            <prop key="get*">PROPAGATION_REQUIRED,readOnly </prop><o:p></o:p>

                            <prop key="save*">PROPAGATION_REQUIRED </prop><o:p></o:p>

                            <prop key="delete*">PROPAGATION_REQUIRED</prop><o:p></o:p>

                            <prop key="update*">PROPAGATION_REQUIRED </prop>

                     </props> <o:p></o:p>

<o:p> </o:p>

</property><o:p></o:p>

<o:p> </o:p>

此处,我们没有指定任何异常,那么它目前默认处理的就是unchecked exception了,再结合我们自身每个项目的模块,在我们的每个项目当中几乎都定义了自己的异常,这些异常都是继承自Exception,很不幸的是,我们继承的Exception包括自己定义的异常,都是checked exception<o:p></o:p>

<o:p> </o:p>

所以,在我们的事务处理机制当中,事务不管用了。<o:p></o:p>

解决办法有2个:<o:p></o:p>

1,在事务属性后面加上需要回滚的checked exception。比如<prop key="save*">PROPAGATION_REQUIRED,-XXXXException</prop>(注意那个"-",对应的是"+")<o:p></o:p>

2, 不改配置文件,将需要事务回滚的异常继承自unchecked exception类,也就是RuntimeException
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值