本文主要讲述springboot提供的声明式的事务管理机制。

一、一些概念

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

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

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

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

二、springboot mybatis事务配置

1、看一下pom依赖

其中:

1)<parent></parent>标签引入springboot父依赖

2)使用了spring和mybatis集成包,整合spring和mybatis

3)mysql数据库驱动包

4)序列化支持fastjson

    <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.19</version>
</dependency>
</dependencies>

2、application.properties

这个配置主要是实现配置mybatis数据源,这超出了本文的叙述范围,大家可以参照这篇博客。http://www.cnblogs.com/kangoroo/p/7133543.html

# 主数据源 moonlight
spring.datasource.moonlight.driverClassName = com.mysql.jdbc.Driver
spring.datasource.moonlight.url=jdbc:mysql://10.93.84.53:3306/moonlight?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&autoReconnect=true&failOverReadOnly=false
spring.datasource.moonlight.username = root
spring.datasource.moonlight.password = 1234
spring.datasource.moonlight.poolMaximumActiveConnections=400
spring.datasource.moonlight.poolMaximumIdleConnections=200
spring.datasource.moonlight.poolMaximumCheckoutTime=20000

之后你可以根据添加的数据源,写好mapper也就是dao层代码。

DAO层代码是使用XML配置方式,还是使用注解实现方式,对事务管理都是没有影响的。

3、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
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);
}
}

4、开启事务

最后你要在Application类中开启事务管理,开启事务管理很简单,只需要@EnableTransactionManagement注解就行

@EnableTransactionManagement
@SpringBootApplication
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}

三、测试一下

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

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

@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;
}
}

springboot mybatis 事务管理的更多相关文章

  1. spring+mybatis事务管理

    spring+mybatis事务管理 最近在和朋友做一个项目,考虑用springmvc+mybatis来做,之前在公司工作吧,对于数据库这块的配置也有人再弄,最近因为这个项目,我就上网学习了一些关于数 ...

  2. spring,mybatis事务管理配置与@Transactional注解使用[转]

    spring,mybatis事务管理配置与@Transactional注解使用[转] spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是至关 ...

  3. 《深入理解mybatis原理》 MyBatis事务管理机制

    MyBatis作为Java语言的数据库框架,对数据库的事务管理是其很重要的一个方面.本文将讲述MyBatis的事务管理的实现机制. 首先介绍MyBatis的事务Transaction的接口设计以及其不 ...

  4. springMVC+mybatis事务管理总结

    1.spring,mybatis事务管理配置与@Transactional注解使用: 概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性.Spring Framewo ...

  5. spring,mybatis事务管理配置与@Transactional注解使用

    spring,mybatis事务管理配置与@Transactional注解使用[转]   spring,mybatis事务管理配置与@Transactional注解使用 概述事务管理对于企业应用来说是 ...

  6. SpringMVC+MyBatis 事务管理二

    前言 上篇主要从编程式事务和声明式事务注解的形式来了解了事务,而这篇我们针对AOP的方式来实现事务.先回顾下事务的基础知识事务的隔离级别和事务的传播行为.使用aop 配置事务时注意引用aspectjw ...

  7. Mybatis 事务管理

    mybatis的事务和数据源有着非常密切的联系.上文讲述了mybatis的数据源,本文要讲述的便是mybatis的事物 1.事务的分类 我们还是已一段xml配置文件为例 <environment ...

  8. mybatis事务管理机制详解

    1.mybatis事务的配置和使用 mybatis事务有两种使用方式: (a):使用JDBC的事务管理机制:即使用java.Sql.Connection对象完成对事务的提交,回滚和关闭操作. (b): ...

  9. Mybatis事务管理

    一.Mybatis事务 1.事务管理方式 Mybatis中的事务管理方式有两种: 1.JDBC的事务管理机制,即使用JDBC事务管理机制进行事务管理 2.MANAGED的事务管理机制,Mybatis没 ...

随机推荐

  1. 记录一次参加D2前端技术论坛的杭州之行

    前言 在这里,闰土首先要感谢以下两位大佬提供的门票,分别是来自新浪微博部门的H同学,以及来自小米科技的D同学. 当我周六晚上在青旅写完这篇文章过后,第二天上网发现,已经有大佬提前一步在掘金上发布了高质 ...

  2. spring aop 动态代理批量调用方法实例

    今天项目经理发下任务,需要测试 20 个接口,看看推送和接收数据是否正常.因为对接传输的数据是 xml 格式的字符串,所以我拿现成的数据,先生成推送过去的数据并存储到文本,以便验证数据是否正确,这时候 ...

  3. 班级博客客户端Beta阶段发布说明

    班级博客客户端Beta阶段发布说明 NewTeam 2017/12/18 项目 博客园班级博客Android客户端 目录 发布方式和发布地址 新功能 修复的缺陷 对运行环境的要求 安装方法 已知的问题 ...

  4. mysql数据库插入数据获取自增主键的三种方式(jdbc PreparedStatement方式、mybatis useGeneratedKeys方式、mybatis selectKey方式)

    通常来说对于mysql数据库插入数据获取主键的方法是采用selectKey的方式,特别是当你持久层使用mybatis框架的时候. 本文除此之外介绍其它两种获取主键的方式. 为了方便描述我们先建一张my ...

  5. cocos2dx-3.0(14)------SpriteBatchNode与SpriteFrameCache加快渲染

    ----我的生活,我的点点滴滴! ! 大家都知道一个游戏里面会有大量的图片.每一个图片渲染是须要时间的,以下分析两个类来加快渲染速度.加快游戏执行速度 一.SpriteBatchNode 1.先说下渲 ...

  6. Android学习笔记(27):日历视图Calendar

    日历视图CalendarView可用于显示和选择日期. 能够调用setOnDateChangedListener()方法绑定事件监听器. 经常使用XML属性和相关方法: XML属性 相关方法 说明 a ...

  7. 我的GIS观

    申明: 文章所述观点与不论什么组织或个人无关,仅代表我个人观点,如有不正确,还望批评指正. 概述: 从毕业到如今,在GIS这条路上也算是摸爬滚打4.5年了.说长也不长,说短也不短.在这4.5年的时间里 ...

  8. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router

    路由koa-router--MVC 中重要的环节:Url 处理器

  9. 解决IOS微信内置浏览器返回后不执行js脚本的问题

    在A页面写一个$(function(){}) 后随便点击一个URL跳转到B页面 利用微信内置浏览器 返回键返回到A页面后发现这段JS不执行,后来找到了解决方案 $(function () { var ...

  10. Ajax 请求后打开新窗口被拦截的解决方案

    公司业务上有个场景,需请求后台获取支付链接地址,再打开地址引导用户购买.这样的场景在其他企业应该也很场景.但是遇到个很常见的问题,Ajax后直接用window.open(url),会被浏览器作为广告拦 ...