本文主要讲述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. MFC控件实现视频“暂停” “播放”循环

    问static有什么作用,朗朗上口,可是用起来呢 MFC"按钮"控件实现开始显示"播放",按一下之后就开始播放相关视频,并且按钮显示为"暂停" ...

  2. BZOJ 1211 HNOI2004 树的计数 Prufer序列

    题目大意:给定一棵树中全部点的度数,求有多少种可能的树 Prufer序列.详细參考[HNOI2008]明明的烦恼 直接乘会爆long long,所以先把每一个数分解质因数.把质因数的次数相加相减.然后 ...

  3. Error code:1728 Cannot load from mysql.proc. The table is probably corrupted

    Error code:1728 Cannot load from mysql.proc. The table is probably corrupted http://bugs.mysql.com/b ...

  4. 对使用多个swiper下标有时显示不出来的问题

    这久写了一个网页,其中有很多的轮播图及tab页面切换,就使用了swiper框架,有时一个网页要用到6-8个,如此就出现了下图这种问题: 有时刷新看不到,有时又能看到,tab切换过去的页面也看不到,其实 ...

  5. Asp.net MVC 填充word并下载

    使用Aspose.word填充内容并下载(免费版Aspose) 填充固定模式的Word文档,需要先制作Word模板: Aspose.Words主要通过Words里域(Fields)来控制内容.     ...

  6. 《跟我学IDEA》四、配置模板(提高代码编写效率)

    上一篇博文,我们学习了idea的一些实用配置,相信大家也对idea这个开发工具有了一个大概的了解.今天我们来学习模板的配置,idea提供很多模板从而提高编写代码的效率,比如说一些经常用的代码及生成文件 ...

  7. .net core中使用GB2312编码的问题

    最近在用.net core写一个爬虫抓取网页上的数据,碰到了网页编码是GBK的页面,抓取的数据都是乱码,当使用Encoding.GetEncoding("GBK")的时候抛出了异常 ...

  8. IntelliJ Idea设置护眼浅绿色背景方法

    老版本的设置位置 新版本的设置位置不一样(下图新版本为2017.5.4)的设置位置

  9. ASP.NET Core 系列视频完结,新项目实战课程发布。

    今天把MVC的章节完成了,给大家从头到尾做了一个登录注册的示例,带前后端Model验证,算是完整的示例.同时借助于eShopOnContainers的示例也做了一个DBContextSeed的包装器来 ...

  10. Oracle数据库(三)表操作,连接查询,分页

    复制表 --复制表 create table new_table as select * from Product --复制表结构不要数据 在where后面跟一个不成立的条件,就会仅复制表的结构而不复 ...