博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring+mybatis事务不起作用的原因
阅读量:6379 次
发布时间:2019-06-23

本文共 1972 字,大约阅读时间需要 6 分钟。

一、场景再现
@Override@Transactionalpublic 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  (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才是养家糊口的利器。

转载于:https://www.cnblogs.com/qy1141/p/6677135.html

你可能感兴趣的文章
当Cacti遭遇大流量
查看>>
Outlook Anywhere 客户端配置详解
查看>>
《Windows Server 2008 R2系统管理实战》前言与内容提要
查看>>
轻巧的网络流量实时监控工具NTOPNG
查看>>
Access、Sql 获取当前插入的主键ID
查看>>
聚类算法之DBScan(Java实现)
查看>>
为什么要使用AOP?
查看>>
VC :模板类
查看>>
对C++中string类型的总结
查看>>
Oracle发布公共云Public Cloud
查看>>
eclipse高亮显示
查看>>
Shell 操作数据库
查看>>
if lte IE if gte IE 浏览器兼容
查看>>
基于Lumisoft.NET组件和.NET API实现邮件发送功能的对比
查看>>
C#数据库访问技术之DATAREADER对象读取数据
查看>>
各种排序方法
查看>>
编译时程序透彻理解异常并合理使用异常
查看>>
2013年5月18日星期六
查看>>
js 字符串操作函数集合
查看>>
nullnullCF 312B(Archer-等比数列极限求和)
查看>>