spring boot集成事务十分的简单,只需要在启动类上面增加@EnableTransactionManagement注解,然后在需要实现事务的方法上添加@Transactional注解就可以了。下面我们根据上一次的代码来演示下。

首先,我们修改下启动类

package com.example.demo;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import org.springframework.transaction.annotation.EnableTransactionManagement; @SpringBootApplication
@MapperScan(basePackages = ("com.example.demo.mapper"))
@EnableTransactionManagement//开启springboot事务的支持
public class DemoApplication extends SpringBootServletInitializer { @Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(DemoApplication.class);
} public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }

在service中添加一个修改方法

package com.example.demo.service;

import com.example.demo.model.Student;

public interface GetStudentService {

    public Student getStudentInfo();

    public int update();
}
package com.example.demo.service.impl;

import com.example.demo.mapper.StudentMapper;
import com.example.demo.model.Student;
import com.example.demo.service.GetStudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; @Service
public class GetStudentServiceImpl implements GetStudentService { @Autowired
private StudentMapper studentMapper; @Override
public Student getStudentInfo() {
Student student = studentMapper.selectByPrimaryKey("122528");
return student;
} @Transactional//增加事务注解
@Override
public int update(){
Student student = new Student();
student.setId("122528");
student.setName("李四");
int ret = studentMapper.updateByPrimaryKey(student); int i = 100/0; //触发异常,测试更新事件会不会回滚
return ret;
}
}

在上面的类中特意引发了异常,用于我们的测试。最后在controlle中添加对修改方法的调用。

package com.example.demo.controller;

import com.example.demo.model.Student;
import com.example.demo.service.GetStudentService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class GetStudentController { @Autowired
private GetStudentService getStudentService; @RequestMapping("/getStudent")
public String getStudent(){
Student student = getStudentService.getStudentInfo();
return "学号=" + student.getId() + ";姓名=" + student.getName();
} @RequestMapping("/updateStudent")
public String updateStudent(){
getStudentService.update();
return "success";
}
}

数据库中原始的姓名是张三,现在将他改为李四,访问地址http://127.0.0.1:8088/demo/updateStudent,最终结果报了异常,然后查看数据库中的值,发现没有发生变化,因此我们的事务注解生效了。


在上面的操作过程中,我发现了一个问题,在controller中如果使用private GetStudentServiceImpl getStudentServiceImpl;启动的时候就会报错:

Description:

The bean 'getStudentServiceImpl' could not be injected as a 'com.example.demo.service.impl.GetStudentServiceImpl' because it is a JDK dynamic proxy that implements:
com.example.demo.service.GetStudentService Action: Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching. Process finished with exit code 1

对此有两种解决方法,一种是我上面的,将代码中的引用由实现类改为接口类即可。另外一种是在开启事务的注解上增加属性。即@EnableTransactionManagement(proxyTargetClass = true),开启CGLIB代理也能解决。

因为开启事务时,会自动开启动态代理,默认的是开启的jdk动态代理。详细解释地址:https://blog.csdn.net/huang_550/article/details/76492600。这块目前还不清楚什么原理,后面再细研究。

spring boot热部署配置,增加pom.xml依赖

 <!-- spring boot热部署插件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>true</scope>
<optional>true</optional>
</dependency>

spring boot事务管理的更多相关文章

  1. Spring Boot事务管理(上)

    摘要 本文主要介绍基于Spring Boot的事务管理,尤其是@Transactional注解详细用法.首先,简要介绍Spring Boot中如何开启事务管理:其次,介绍在Spring,Spring ...

  2. Spring Boot事务管理(中)

    在上一篇 Spring Boot事务管理(上)的基础上介绍Spring Boot事务属性和事务回滚规则 . 4 Spring Boot事务属性 什么是事务属性呢?事务属性可以理解成事务的一些基本配置, ...

  3. Spring Boot事务管理(下)

    在上两篇 Spring Boot事务管理(上)和Spring Boot事务管理(中)的基础上介绍注解@Transactional. 5 @Transactional属性 属性 类型 描述 value ...

  4. 【Spring Boot学习之四】Spring Boot事务管理

    环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.springboot整合事务事务分类:编程事务.声明事务(XML.注解),推荐使用注解方式,springboot默 ...

  5. Java框架spring Boot学习笔记(六):Spring Boot事务管理

    SpringBoot和Java框架spring 学习笔记(十九):事务管理(注解管理)所讲的类似,使用@Transactional注解便可以轻松实现事务管理.

  6. Spring系列.事务管理

    Spring提供了一致的事务管理抽象.这个抽象是Spring最重要的抽象之一, 它有如下的优点: 为不同的事务API提供一致的编程模型,如JTA.JDBC.Hibernate和MyBatis数据库层 ...

  7. Spring的事务管理

    事务 事务:是逻辑上一组操作,要么全都成功,要么全都失败. 事务特性(ACID) 原子性:事务不可分割 一致性:事务执行的前后,数据完整性保持一致 隔离性:一个事务执行的时候,不应该受到其他事务的打扰 ...

  8. spring笔记--事务管理之声明式事务

    事务简介: 事务管理是企业级应用开发中必不可少的技术,主要用来确保数据的完整性和一致性, 事务:就是一系列动作,它们被当作一个独立的工作单元,这些动作要么全部完成,要么全部不起作用. Spring中使 ...

  9. Spring应用——事务管理

    事务基础:请参看:http://www.cnblogs.com/solverpeng/p/5720306.html 一.Spring 事务管理 1.前提:事务管理器 在使用 Spring 声明式事务管 ...

随机推荐

  1. python项目管理

    Python 通常没有对应 Java 的 Ant / Maven 这样的 build tool,有一个用于打包的 setuptools / distutils 但也并不完全等价.如果是用来管理依赖包, ...

  2. ACM感想、

    从15年10月开始搞ACM,到如今的16年4月底,已经接近半年了. 大一下学期开始ACM组的人员就不断减少,有的因为坚持不下,有的因为不喜欢,有的没留下理由就走了, 瞬间感觉实验室空了很多很多.现在常 ...

  3. HMM(隐马尔科夫)用于中文分词

    隐马尔可夫模型(Hidden Markov Model,HMM)是用来描述一个含有隐含未知参数的马尔可夫过程. 本文阅读了2篇blog,理解其中的意思,附上自己的代码,共同学习. 一.理解隐马尔科夫 ...

  4. codedecision P1113 同颜色询问 题解 线段树动态开点

    题目描述:https://www.cnblogs.com/problems/p/11789930.html 题目链接:http://codedecision.com/problem/1113 这道题目 ...

  5. HDU 1026 BSF+优先队列+记录路径、

    #include<iostream> #include<cmath> #include<cstring> #include<cstdio> #inclu ...

  6. Python--day64--找到作者关联的所有书籍对象、ORM多对多关联查询的原理

    找到当前作者关联的所有书籍对象: ORM多对多关联查询的原理: 编辑作者:

  7. C# 标准性能测试

    经常我写一个类,作为一个工具类,小伙伴会问我这个类的性能,这时我就需要一个标准的工具进行测试. 本文告诉大家如何使用 benchmarkdotnet 做测试. 现在在 github 提交代码,如果有小 ...

  8. 超容易理解的call()、apply()、bind()的区别

    call().apply().bind()是用来改变this的指向的. 一 举个例子 一个叫喵喵的猫喜欢吃鱼,一个叫汪汪的小狗喜欢啃骨头,用代码实现如下: 有一天,小狗汪汪和喵喵共进午餐的时候,汪汪说 ...

  9. Linux 内核子系统

    一个子系统是作为一个整体对内核一个高级部分的代表. 子系统常常(但是不是一直)出现 在 sysfs 层次的顶级. 一些内核中的例子子系统包括 block_subsys(/sys/block, 给块 设 ...

  10. LuoguP5464 缩小社交圈

    LuoguP5464 缩小社交圈 背景:洛谷七月月赛T4 题目大意给定\(n\)个点,每个点的权值对应着一个区间\([l_i,r_i]\),两个点\(i,j\)有边当且仅当他们权值的并集不为空集,问有 ...