spring mvc 事务不生效 不回滚

4 篇文章 0 订阅
1 篇文章 0 订阅

基础真的太重要了,这个问题困扰了我大半天。

开始的时候,不管我使用注解还是配置文件的形式,事务都不好使,也就是出异常了事务不回滚。因为首先怀疑的是我自己写的代码有问题,所以搜了好多资料,一一对比,没有发现任何问题,后来才发现,原来是spring扫描的先后顺序导致的问题。

下面说说我的解决方式:

首先配置扫描范围如下

<context:component-scan base-package="com.test.*" >   
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" />    
   </context:component-scan>  

然后配置事务如下:

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" /> 
    

<!--  下面这一段才是关键  -->
<context:component-scan base-package="com.test.*">   
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />   
</context:component-scan>  

然后我的问题就解决了。

原理目前我还没有研究,就看到网友这么写的:

Spring会扫描并优先注册默认的bean(当然包括标记为@Service的bean),这样,标记为@Transactional的service由于transaction manager尚未注册而未能生效,导致事务管理失效。 

原理是:标记为@Transactional的service会wrap为经过transactional proxied(不管是CGLIB based或是JDK based)的bean,而不再是纯的service; 

有时间在研究一下,怎么使用标签 use-default-filters="false" 来实现,因为我觉得这个才是解决的根本,我上面的方法只是让spring重新去扫描了一次,不是最优解决方式。

Spring 中,当我们使用声明式事务管理时,如果事务回滚不生效,可能会出现以下几种情况: 1. 没有正确配置事务管理器 在 Spring 中,事务管理器是用来管理事务的核心组件。如果没有正确配置事务管理器,可能会导致事务回滚不生效。通常情况下,我们需要将事务管理器配置到 Spring 的配置文件中,并且为每一个需要事务管理的方法添加 @Transactional 注解。 2. 没有正确使用 @Transactional 注解 在使用 @Transactional 注解时,需要注意一些细节问题,例如:是否正确设置事务传播行为、是否正确设置事务隔离级别、是否正确设置回滚条件等。如果没有正确使用 @Transactional 注解,也可能会导致事务回滚不生效。 3. 异常被捕获并处理了 如果我们在代码中捕获了异常,并且在 catch 块中对异常进行了处理,那么事务就无法回滚。这是因为在异常被捕获并处理后,Spring 就认为这个异常已经被处理了,事务也就无法回滚了。 4. 配置文件中开启了事务自动提交 如果在 Spring 的配置文件中开启了事务自动提交,那么事务就无法回滚。在开启事务自动提交的情况下,Spring自动提交事务,而不会等待事务结束后再进行提交。因此,如果需要使用事务回滚,需要将事务自动提交关闭。 总之,如果事务回滚不生效,我们需要仔细检查代码和配置文件,找出问题所在,并进行修正。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值