SpringMVC的事务配置以及使用

自己学习然后搭建了一个Spring+SpringMVC+Mybatis的框架,然后实现事务

这里是事务的配置


<!-- 配置数据源 使用的是Druid数据源 -->
<bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <!-- 用来检测有效sql -->
    <property name="validationQuery" value="${validationQuery}" />
    ......
</bean>


<!-- 配置事务管理 -->
<bean name="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>

<!-- 拦截器方式配置事物 -->
<tx:advice id="transactionAdvice" transaction-manager="transactionManager">
    <tx:attributes>
        <!-- 必须要有事务,没有则创建 -->
        <tx:method name="insert*" propagation="REQUIRED" />
        <tx:method name="update*" propagation="REQUIRED" />
        <tx:method name="delete*" propagation="REQUIRED" />
        <!-- 可以有可以没有 -->
        <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
        <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
    </tx:attributes>
</tx:advice>


<!-- Spring aop事务管理 -->
<aop:config>
    <aop:pointcut id="transactionPointcut" expression="execution(* com.sanguo.service.impl..*Impl.*(..))" />
    <aop:advisor pointcut-ref="transactionPointcut" advice-ref="transactionAdvice"/>
</aop:config>

如果不会配置的可以自己在网上找其他博客,里面有详细配置ssm项目的配置,在这里推荐一个
http://blog.csdn.net/gebitan505/article/details/44455235/

配置好之后写了个测试类去实验一下

public int insertList(List<User> userList) {

        for (User user : userList) {
            userMapper.insert(user);
        }

        return 1;
 }

这里写图片描述
这里写图片描述
第一次运行插入list里面的user数据没有问题,因为这个没有异常,可以很好的运行下去,主键也自动增加了5个
之后我就想在程序运行出现异常看看能否完成插入,看看数据能不能回滚

public int insertList(List<User> userList){

        for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 1 / 0;
        return 1;
    }

这次我写了一个“1/0”,这样运行就会出错,这样让程序出错看看能否增加成功

这里写图片描述
这里写图片描述

这次可以看见主键确实是增加了,但是数据确没有添加成功,说明事务确实是配置成功了

但是我听说事务成功需要把异常去抛出来,于是我试了一下把异常捕获,然后解决看一下

public int insertList(List<User> userList){

       for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 0;
        try {
            s = 1 / 0;
        } catch (Exception e) {
            // 捕获了异常,并把异常信息打印
            e.printStackTrace();   
        }
        return 1;
    }

在运行的时候把这个会出现异常的代码try-catch,然后去运行

这里写图片描述
这里写图片描述

这里写图片描述

看到,控制台确实有异常,并且也打印出了结果,把异常捕获之后,确实可以插入成功

然后我再尝试把异常给抛出去看看能够添加成功不,于是又改造了一下方法

public int insertList(List<User> userList) throws  Exception{

       for (User user : userList) {
            userMapper.insert(user);
        }
        int s = 0;
        try {
            s = 1 / 0;
        } catch (Exception e) {
            e.printStackTrace(); 
            throw e;// 抛出异常
        }
        return 1;
    }

这里写图片描述

这里写图片描述

可以看到主键增加了,但是数据库数据并没有增加,说明事务确实成功

总结:

事务配置确实是有用的,但是在使用事务的时候,需要在某个service中去把异常抛出来,不能去try-catch的解决它,只有在service中抛出来然后又异常,事务才能够真正的起作用。
  • 4
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值