在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面。

mybatis与spring集成后,其事务该怎么做?其实很简单,直接在上一节代码的基础上在相应的方法(通常是service层)上加上@Transactional注解即可。

1、com.xxx.firstboot.exception.UserException

 package com.xxx.firstboot.exception;

 import org.springframework.dao.DataAccessException;

 /**
* 自定义异常,用于测试事务
*/
public class UserException extends DataAccessException{ private static final long serialVersionUID = 8901479830692029025L; public UserException(String msg) {
super(msg);
} }

说明:这是一个自定义注解,继承了DataAccessException类。

2、com.xxx.firstboot.dao.UserDao

     public int insertUser(String username, String password){
return userMapper.insertUser(username, password);
} public void testTransactional(String username){
throw new UserException("测试事务");
}

说明:该类中对于事务的测试只使用到了两个方法,第二个方法testTransactional抛出自定义的异常。

3、com.xxx.firstboot.service.UserService

     @Transactional
public void testTransaction(String username, String password){
System.out.println(userDao.insertUser(username, password));
userDao.testTransactional(username);
}

说明:在该方法中调用了上述的userDao的两个方法。

第一个方法向数据库插入一条数据,第二个方法抛出我们的自定义异常,如果事务配置成功,那么第一个方法插入数据库会回滚,否则,插入数据成功。

4、com.xxx.firstboot.controller.UserController

     @ApiOperation("测试事务")
@ApiImplicitParams({
@ApiImplicitParam(paramType="query",name="username",dataType="String",required=true,value="用户的姓名",defaultValue="zhaojigang"),
@ApiImplicitParam(paramType="query",name="password",dataType="String",required=true,value="用户的密码",defaultValue="wangna")
})
@ApiResponses({
@ApiResponse(code=400,message="请求参数没填好"),
@ApiResponse(code=404,message="请求路径没有或页面跳转路径不对")
})
@RequestMapping(value="/testTransaction",method=RequestMethod.GET)
public void testTransaction(@RequestParam("username") String username,
@RequestParam("password") String password) {
userService.testTransaction(username, password);
}

测试:

使用maven命令启动服务-->swagger运行URL-->查看数据库是否插入成功

疑问:查了很多资料,mybatis与springboot集成后(数据源采用了druid),为了添加事务,很多人会在上一节的MyBatisConfig这个类中做两件事请

  • 在MyBatisConfig类上添加@EnableTransactionManagement注解,该注解启用了注解式事务管理 <tx:annotation-driven />,这样在方法上的@Transactional注解就起作用了,但是实际测试中不加这句,@Transactional注解依然有用
  • 在MyBatisConfig类中添加了获取事务管理器的方法
         /**
    * 配置事务管理器
    */
    @Bean
    @Primary
    public DataSourceTransactionManager transactionManager() throws Exception{
    return new DataSourceTransactionManager(getDataSource());
    }

    添加这句的作用:在使用@Transactional注解的地方使用方法中的事务管理器进行事务管理。

第六章 springboot + 事务的更多相关文章

  1. 第六章 springboot + 事务(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5350106.html 在实际开发中,其实很少会用到事务,一般情况下事务用的比较多的是在金钱计算方面. myba ...

  2. 第十六章 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  3. SpringBoot | 第二十六章:邮件发送

    前言 讲解了日志相关的知识点后.今天来点相对简单的,一般上,我们在开发一些注册功能.发送验证码或者订单服务时,都会通过短信或者邮件的方式通知消费者,注册或者订单的相关信息.而且基本上邮件的内容都是模版 ...

  4. 【第十六章】 springboot + OKhttp + String.format

    模拟浏览器向服务器发送请求四种方式: jdk原生的Http包下的一些类 httpclient(比较原始,不怎么用了):第一章 HttpClient的使用 Okhttp(好用,推荐) retrofit( ...

  5. 第十六章 综合实例——《跟我学Shiro》

    简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 password varchar 1 ...

  6. [CSAPP笔记][第六章存储器层次结构]

    第六章 存储器层次结构 在简单模型中,存储器系统是一个线性的字节数组,CPU能够在一个常数访问每个存储器位置. 虽然是一个行之有效的模型,但没有反应现代系统实际工作方式. 实际上,存储器系统(memo ...

  7. 第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

    原文:第十六章--处理锁.阻塞和死锁(3)--使用SQLServer Profiler侦测死锁 前言: 作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用.此时,你需要尽快侦测 ...

  8. 一起来学Spring Cloud | 第六章:服务网关 ( Zuul)

    本章节,我们讲解springcloud重要组件:微服务网关Zuul.如果有同学从第一章看到本章的,会发现我们已经讲解了大部分微服务常用的基本组件. 已经讲解过的: 一起来学Spring Cloud | ...

  9. 十六章 综合实例——《跟我学Shiro》

    目录贴:跟我学Shiro目录贴 简单的实体关系图 简单数据字典 用户(sys_user) 名称 类型 长度 描述 id bigint 编号 主键 username varchar 100 用户名 pa ...

随机推荐

  1. python--ulipad控制台中文输出乱码

    ulipad用起来顺手,而不尽人意的地方时,它不能正确输出中文.而且有人指出这和文件的编码没关系,所以将”设置“选项里”缺省文档编码“修改为”utf-8“也无济于事.为了解决这个问题,我在网上搜了搜, ...

  2. WebApi:过滤器的种类

    WebApi:筛选器的种类 授权筛选器:这些筛选器用于实现IAuthorizationFilter和做出关于是否执行操作方法(如执行身份验证或验证请求的属性)的安全决策.AuthorizeAttrib ...

  3. WebApi:使用方法名或者控制器名作为接口地址

    今天遇到一个问题:新建的WebApi的项目生成的接口的地址都是以控制器的名字命名的,这样的话,在方法前添加ActionName就不起作用了,但之前一个项目是可以的. 接口代码: public clas ...

  4. Intellij IDEA的激活

    选server激活,填http://www.iteblog.com/idea/key.php即可 现在改为http://idea.iteblog.com/key.php

  5. PHP发送请求头和接收打印请求头

    一.发送请求头 //发送地址 $url = 'http://127.0.0.1/2.php'; //请求头内容 $headers = array( 'Authorization: '.$basic, ...

  6. Oracle游标示例

    -- 声明游标:CURSOR cursor_name IS select_statement --For 循环游标 --(1)定义游标 --(2)定义游标变量 --(3)使用for循环来使用这个游标 ...

  7. sqlite 报错:database is locked

    在sqlite批量添加数据时,报错:database is locked. 解决办法:将db路径由相对路径设置为绝对路径.

  8. Makefile 自动化变量

    Makefile中常用自动化变量解释如下: $@------规则的目标文件名 $<------规则的第一个依赖项文件名 $^------规则的所有依赖文件列表,以空格隔开. $?-------所 ...

  9. Quartus II中FPGA的管脚分配保存方法

    一.摘要 将Quartus II中FPGA管脚的分配及保存方法做一个汇总. 二.管脚分配方法 FPGA 的管脚分配,除了在QII软件中,选择“Assignments ->Pin”标签(或者点击按 ...

  10. 快速排序 && 希尔排序 && 插入排序

    1. 快速排序 不稳定的排序. 平均(与最好情况)时间复杂度:O(nlgn)   |  最坏情况时间复杂度(元素有序,递归栈为 O(n)):O(n2) 适合的数据结构:数组,双向链表. #includ ...