SSM-@Transactional 注释不生效

1.在applicationConext.xml 中配置事务注解驱动

<!-- 事务注解驱动 --> 
        <tx:annotation-driven /> 
         <!-- 配置事务 -->
       <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <property name="dataSource" ref="basicDataSource" />
        </bean>

2.Service中做如下配置

@Service
public class AccountService {
    @Autowired
    AccountMapper am;
    
    @Transactional
    public void zhuanZhang(Integer fromAcct,Integer toAcct,Double money){
        //先减去fromAcct 的钱
        am.updateMoneyByAcctNumber(fromAcct, money*(-1));
        System.out.println("先减去fromAcct 的钱"+money*(-1));
                
        System.out.println(10/0);
        
        //再加上toAcct 上的钱
        am.updateMoneyByAcctNumber(toAcct, money);
        System.out.println("再加上toAcct 上的钱"+money);
    }
}

3.Springmvc.xml 中包扫描的配置如下

<!-- 配置包扫描 -->
               <context:component-scan base-package="cn.zen.controller.*,cn.zen.service" />

4.结果测试事务报错回滚的时候不成功。

查看框架的启动日志看到 Spring没有接管JDBC事务的报错

JDBC Connection [jdbc:mysql://*****, MySQL-AB JDBC Driver] will not be managed by Spring 

5.解决方式是

将带有事务注解的包放到ApplicationContext.xml 中扫描,同时在springmvc.xml 中剔除该包的扫描。

百度了一下具体原因,相对明晰的说法:

Spring容器优先加载由ServletContextListener,对应applicationContext.xml 产生的父容器,而SpringMVC(对应spring-mvc.xml)产生的是子容器。
子容器Controller进行扫描装配时装配的@Service注解的实例是没有经过事务加强处理,即没有事务处理能力的Service,而父容器进行初始化的Service是保证事务的增强处理能力的。如果不在子容器中将Service exclude掉,此时得到的将是原样的无事务处理能力的Service。

据此得到两个结论:

1.Spring 才能处理事务,Springmvc 不行。
2..子容器回覆盖父容器中的相同配置,所以要在包注解扫描的时候在子容器中将Service exclude掉

转载于:https://www.cnblogs.com/Alex-Zeng/p/9573178.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SSM使用@Transactional注解来开启事务。事务是在Spring框架处理数据库的增删改操作时非常重要的一部分。通过使用@Transactional注解,可以将一系列数据库操作作为一个事务来处理,保证这些操作要么全部成功提交,要么全部回滚。@Transactional注解可以应用于类级别和方法级别。 在SSM使用@Transactional注解的步骤如下: 1. 首先,在Spring配置文件配置事务管理器的bean。可以使用Spring的内置事务管理器或者集成其他的事务管理器,如JTA事务管理器。 2. 然后,在需要开启事务的类或方法上添加@Transactional注解注解可以添加在类级别上,表示所有的方法都将被包装在同一个事务;也可以添加在方法级别上,表示该方法将被包装在一个独立的事务。 3. 当程序执行到被@Transactional注解修饰的方法时,Spring框架会自动开启一个事务,并在方法执行完毕后根据返回结果决定是提交事务还是回滚事务。 例如,如果在SSM项目的某个Service类的方法上需要开启事务,可以在该方法上添加@Transactional注解,示例如下: ```java @Service public class UserService { @Autowired private UserDao userDao; @Transactional public void saveUser(User user) { // 执行数据库操作 userDao.save(user); } } ``` 在上述示例,saveUser方法被@Transactional注解修饰,表示该方法将被包装在一个事务。如果在方法执行过程发生了异常,事务将会回滚,数据库操作将会撤销;如果方法执行成功,事务将会提交,数据库操作将会生效。 总结起来,使用@Transactional注解可以方便地管理事务,并确保数据库操作的一致性和完整性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [spring的隔离级别](https://download.csdn.net/download/handsome221/87368148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [SSM入门到精通项目实战(附源码)](https://download.csdn.net/download/weixin_26971157/19603351)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [SSM @Transactional 事务控制](https://blog.csdn.net/weixin_43432438/article/details/124421316)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值