一、一些概念

声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优点是:

1)非侵入式,业务逻辑不受事务管理代码的污染。

2)方法级别的事务回滚,合理划分方法的粒度可以做到符合各种业务场景的事务管理。

本文使用目前最常用的mybatis框架来配置springboot的事务管理机制。下面进入配置方法介绍。

二、开启事务 一个注解很简单

@EnableTransactionManagement //开始事务

三、Service

在设计service层的时候,应该合理的抽象出方法包含的内容。

然后将方法用@Trasactional注解注释,默认的话在抛出Exception.class异常的时候,就会触发方法中所有数据库操作回滚,当然这指的是增、删、改。

当然,@Transational方法是可以带参数的,具体的参数解释如下:

 
属性 类型 描述
value String 可选的限定描述符,指定使用的事务管理器
propagation enum: Propagation 可选的事务传播行为设置
isolation enum: Isolation 可选的事务隔离级别设置
readOnly boolean 读写或只读事务,默认读写
timeout int (in seconds granularity) 事务超时时间设置
rollbackFor Class对象数组,必须继承自Throwable 导致事务回滚的异常类数组
rollbackForClassName 类名数组,必须继承自Throwable 导致事务回滚的异常类名字数组
noRollbackFor Class对象数组,必须继承自Throwable 不会导致事务回滚的异常类数组
noRollbackForClassName 类名数组,必须继承自Throwable 不会导致事务回滚的异常类名字数组

代码:

@Service
public class GeoFenceService { @Autowired
private MoonlightMapper moonlightMapper; @Transactional(rollbackFor = Exception.class)//可以不加直接使用@Transactional
public int addGeoFence(GeoFence geoFence) {
String formatTime = TimeFunction.transTimeToFormatPerfect(System.currentTimeMillis());
geoFence.setCreateTime(formatTime);
geoFence.setUpdateTime(formatTime);
return moonlightMapper.insertOne(geoFence);
} @Transactional
public int batchGeoFence(List<GeoFence> geoFenceList) {
String formatTime = TimeFunction.transTimeToFormatPerfect(System.currentTimeMillis());
for (GeoFence geoFence : geoFenceList) {
geoFence.setCreateTime(formatTime);
geoFence.setUpdateTime(formatTime);
}
return moonlightMapper.insertBatch(geoFenceList);
}
}

四、测试一下

可以做一个简单的测试,主动抛出异常,测试一下是否真的能保证事务性。

在执行完插入之后,手动抛出一个空指针异常,可以发现数据真的回滚了。

@Service
public class GeoFenceService { @Autowired
private MoonlightMapper moonlightMapper; @Transactional
public int addGeoFence(GeoFence geoFence) {
String formatTime = TimeFunction.transTimeToFormatPerfect(System.currentTimeMillis());
geoFence.setCreateTime(formatTime);
geoFence.setUpdateTime(formatTime);
int count = moonlightMapper.insertOne(geoFence);
String a = null;
a.indexOf('c');
return count;
}
}

五、如果项目启动报错不要急,因为我也遇到了,下面解决一下

报错信息:

使用spring-boot做事务管理时,出现异常:The bean 'xxx' could not be injected as a 'xx.xxxx' because it is a JDK dynamic proxy that implements:

搞了半天发现是因为代理的原因;

异常信息:

解决方案:

因为加了@Transaction的类会自动开启动态代理,java的代理机制主要有JDK动态代理和CGLIB,报上面的错误是因为使用了JDK动态代理机制,我尝试开启@Transaction设置@EnableTransactionManagement(proxyTargetClass = true),问题解决;特此记录一下;

springboot+mybatis 使用事务的更多相关文章

  1. springboot mybatis 事务管理

    本文主要讲述springboot提供的声明式的事务管理机制. 一.一些概念 声明式的事务管理是基于AOP的,在springboot中可以通过@Transactional注解的方式获得支持,这种方式的优 ...

  2. 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务

    文章来自: https://blog.csdn.net/qq_29242877/article/details/79033287 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据 ...

  3. spring-boot (四) springboot+mybatis多数据源最简解决方案

    学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...

  4. springboot(整合事务和分布式事务)

    springboot +mybatis 单数据源,事务 事务:简单理解指的是一组操作,里面包含许多个单一的逻辑,只要有一个逻辑没有执行成功 ,那么都算失败.所有的数据都回归到最初的状态(回滚) 代码实 ...

  5. springboot + mybatis + 多数据源

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...

  6. springboot + mybatis +easyUI整合案例

    概述 springboot推荐使用的是JPA,但是因为JPA比较复杂,如果业务场景复杂,例如企业应用中的统计等需求,使用JPA不如mybatis理想,原始sql调优会比较简单方便,所以我们的项目中还是 ...

  7. DB数据源之SpringBoot+Mybatis踏坑过程实录系列(一)

    DB数据源之SpringBoot+MyBatis踏坑过程(一) liuyuhang原创,未经允许进制转载 系列目录 DB数据源之SpringBoot+Mybatis踏坑过程实录(一) DB数据源之Sp ...

  8. spring boot配置mybatis和事务管理

    spring boot配置mybatis和事务管理 一.spring boot与mybatis的配置 1.首先,spring boot 配置mybatis需要的全部依赖如下: <!-- Spri ...

  9. DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描

    DB数据源之SpringBoot+MyBatis踏坑过程(三)手工+半自动注解配置数据源与加载Mapper.xml扫描 liuyuhang原创,未经允许禁止转载    系列目录连接 DB数据源之Spr ...

随机推荐

  1. 最好用linux版QQ

    这个版本的qq是见过linux下做好用的qq,希望对大家有用; 安装简单,qq易用,不卡死,可以接收文件. 安装过程如下: git clone https://gitee.com/wszqkzqk/d ...

  2. 基础数据类型之集合和深浅copy,还有一些数据类型补充

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  3. Design Support库中的控件

    1.NavigationView滑动菜单 2.FloatIngActionButton悬浮按钮 3.Snackbar二次交互提示的按钮 4.Coordinatorlayout,监听子控件的各种事件(加 ...

  4. Mysql学习(三)之数据库管理工具Navicat

    前言 mysql安装完后默认只有命令行工具,所以我们可以下载一些数据库管理工具Navicat Navicat使用 首先建立一个连接选择mysql,填写信息 发现多了一个localhost,双击,打开连 ...

  5. 第十篇.2、python并发编程之多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  6. linux系统使用grep命令提取文件的基名或者路径名

    效果等于~]#dirname /etc/sysconfig/network-scripts/ifcfg-ens33 echo "/etc/sysconfig/network-scripts/ ...

  7. pkg-config --libs libusb-1.0

    pkg-config --libs libusb-1.0 pkg-config --libs libusb-1.0 pkg-config --libs libusb-1.0

  8. redis事务(转载)

    原文地址:http://blog.csdn.net/hechurui/article/details/49508749 Redis事务 首先,Redis本身是单线程的. redis中的事务(trans ...

  9. HTML5 Geolocation学习

    GeolocationAPI学习,我写的挺枯燥的,直接跳到最后看示例. 5.1 位置信息 HTML5 Geolocation API的使用方法相当简单.请求一个位置信息,如果用户同意,浏览器就会返回位 ...

  10. Puppet部署:安装puppet server、client

    Puppet部署:安装puppet server.client   puppet与其他手工操作工具有一个最大的区别就是 puppet的配置具有稳定性,因此你可以多次执行puppet,一旦你更新了你的配 ...