zoukankan      html  css  js  c++  java
  • spring+mybatis事务不起作用的原因

    一、场景再现
    @Override
    @Transactional
    public void updateById(String userId,String username) throws Exception {
       sysUserDao.UpdatedById(userId,username);
       if (1==1) {
          throw new Exception("故意抛出测试...");
       }
       sysUserDao.UpdatedById(userId,username+"final");
    }


    以上就是不起作用的代码,经分析,问题就出在这段代码中。(applicationContext.xml 是标准配置,相信你不会配错)

    二、问题分析
    上述代码日志打出来后,竟然发现出异常后,事务尽然是commit;

    2017-04-07 09:42:16,746 DEBUG-> Creating a new SqlSession
    2017-04-07 09:42:16,754 DEBUG-> Registering transaction synchronization for SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27c35069]
    2017-04-07 09:42:16,766 DEBUG-> JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@592f13f0] will be managed by Spring
    2017-04-07 09:42:16,855 DEBUG-> Releasing transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27c35069]
    2017-04-07 09:42:16,857 DEBUG-> Transaction synchronization committing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27c35069]
    2017-04-07 09:42:16,857 DEBUG-> Transaction synchronization deregistering SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27c35069]
    2017-04-07 09:42:16,857 DEBUG-> Transaction synchronization closing SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27c35069]

    后来查看文档发现这么一段

    If no rules are relevant to the exception, it will be treated like DefaultTransactionAttribute (rolling back on runtime exceptions).

    理解为:默认情况下,事务遇到运行时异常会回滚;而非运行期异常,事务是不会回滚的。

    三、解决办法

    解决办法很简单,告诉事务管理器,遇到非运行期异常,也同样需要回滚。

    @Override
    @Transactional(rollbackFor = {RuntimeException.class,Exception.class})
    
    public void updateById(String userId,String username) throws Exception {
       sysUserDao.UpdatedById(userId,username);
       if (1==1) {
          throw new Exception("故意抛出测试...");
       }
       sysUserDao.UpdatedById(userId,username+"final");
    }

     

    题外话:园子里可能很多还是奋战在.net领域的同学,作为一个在一线开发+管理多年经验的老鸟来看,同经验同水平的.net员比java员薪水低20%,级别越高,差距越大,结论就是,如果你想在后端发展,能转java尽早转,不能转创造条件转,.net可以作为兴趣来研究,java才是养家糊口的利器。

  • 相关阅读:
    腾讯大数据开发实习面经
    网易游戏2021暑期实习生 游戏运营管理面经 已拿offer
    猿辅导大数据校招1面+2面面经
    虎牙直播内容运营(英雄联盟)三轮超高质量面经分享
    字节跳动日常实习广告大数据研发实习面经(初面)
    运营小白超详细三轮面试拿到字节跳动offer
    字节跳动前端日常实习三轮技术面经
    360大数据开发实习面经
    美团大数据开发工程师校招面经
    高级运维工程师的打怪升级之路
  • 原文地址:https://www.cnblogs.com/qy1141/p/6677135.html
Copyright © 2011-2022 走看看