Spring Boot(十二)Spring Boot中数据库事务的使用

你好,【程序职场】专注于:Spring Boot ,微服务 和 前端APP开发,闲暇之余一起聊聊职场规划,个人成长,还能带你一起探索 副业赚钱渠道,在提升技术的同时我们一起交流 敏捷流程 提高工作效率,从技术到管理一步步提升自我!
 
标签:一个执着的职场程序员!

本文是Spring Boot系列的第十二篇,了解前面的文章有助于更好的理解本文:


1.Spring Boot(一)初识Spring Boot框架
2.Spring Boot(二)Spring Boot基本配置
3.Spring Boot(三)Spring Boot自动配置的原理
4.Spring Boot(四)Spring Boot web项目开发
5.Spring Boot(五)Spring Boot web开发项目(2)配置
6.Spring Boot(六)Spring Boot web开发 SSL配置
7.Spring Boot(七)Spring Boot Websocket
8.Spring Boot(八)Spring Boot Websocket实现聊天功能
9.Spring Boot(九)Spring Boot Bootstrap和AngularJS的使用
10.Spring Boot(十)Spring Boot中使用JPA
11.Spring Boot(十一)Spring Boot中使用REST资源输出


前言

(一). 数据库事务

(二). Transactional 注解的常用属性表

(三). 数据库事务 使用 实战

上篇文章为大家讲述了 Spring Boot中 使用REST资源输出;本篇文章接着上篇内容继续为大家介绍SpringBoot中 数据库事务的使用。

(一). 数据库事务

Spring声明式事物的实现,有两种方式;第一种是配置xml,第二种是使用相关注解

Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactional 便可。

关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。

(二). Transactional 注解的常用属性表

给出Transactional 注解的常用属性表:

propagation

事务的传播行为,默认值为 REQUIRED。

isolation

事务的隔离度,默认值采用 DEFAULT

timeout

事务的超时时间,默认值为-1,不超时。

如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。

read-only

指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。

rollbackFor

用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}

noRollbackFor

抛出 no-rollback-for 指定的异常类型,不回滚事务。{xxx1.class, xxx2.class,……}

……

(三). 数据库事务 使用 实战
#新建Spring Boot项目
 


#数据库配置

我们这里还是使用mysql 数据库,需要添加依赖。

<dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.40</version></dependency>

#在 application.properties 文件中 添加数据库配置信息

数据库配置中有关数据库 在项目 resources 目录下。

spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/springboottransac?useUnicode=true&characterEncoding=utf-8spring.datasource.username=rootspring.datasource.password=root
spring.jpa.hibernate.ddl-auto=updatespring.jpa.show-sql=truespring.jackson.serialization.indent_output=true

#实体类

实体类是用来生成数据对象,用来查询数据

package org.myyoung.cxzc.springboottransaction;import javax.persistence.Entity;import javax.persistence.GeneratedValue;import javax.persistence.Id;
@Entitypublic class Person {    @Id    @GeneratedValue    private Long id;    private String name;    private String detail;    private Integer time;    private String writer;
    public Long getId() {        return id;    }
    public void setId(Long id) {        this.id = id;    }
    public String getName() {        return name;    }
    public void setName(String name) {        this.name = name;    }
    public String getDetail() {        return detail;    }
    public void setDetail(String detail) {        this.detail = detail;    }
    public Integer getTime() {        return time;    }
    public void setTime(Integer time) {        this.time = time;    }
    public String getWriter() {        return writer;    }
    public void setWriter(String writer) {        this.writer = writer;    }
    public Person(String name, String detail, Integer time, String writer) {        this.name = name;        this.detail = detail;        this.time = time;        this.writer = writer;    }}

#创建实体类 Repository

package org.myyoung.cxzc.springboottransaction;import org.springframework.data.jpa.repository.JpaRepository;
public interface PersonRepository extends JpaRepository<Person,Long> {}
这里我们测试事务的使用,所以只是用里面的已有函数 save,这里不添加自定义的数据库操作函数。

#业务服务Service

1. 服务接口

package org.myyoung.cxzc.springboottransaction;public interface DemoService {    public Person savePersonWithRollBack(Person person);
    public Person savePersonWithoutRollBack(Person person);}

这里我们添加了两个服务接口 ,用来测试事务的回滚操作。

2. 服务实现

package org.myyoung.cxzc.springboottransaction;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import javax.transaction.Transactional;
@Servicepublic class DemoServiceImpl implements DemoService {    @Autowired    PersonRepository personRepository;
    @Transactional(rollbackOn = {IllegalArgumentException.class})    @Override    public Person savePersonWithRollBack(Person person) {        Person p = personRepository.save(person);        if (person.getName().equals("程序职场")) {            throw new IllegalArgumentException("程序职场 已存在,数据将回滚");        }        return p;    }
    @Transactional(dontRollbackOn= {IllegalArgumentException.class})    @Override    public Person savePersonWithoutRollBack(Person person) {        Person p = personRepository.save(person);        if (person.getName().equals("程序职场")) {            throw new IllegalArgumentException("程序职场 已存在,但数据不会回滚");        }        return p;    }}

1. 注入PersonRepository的Person Bean 2.使用 @Transactional注解的rollbackOn 属性 指定特定异常时的数据回滚。
3.做验证手动触发异常
4.使用 @Transactional注解的dontRollbackOn 属性,指定特定异常时的数据不回滚。

#创建控制器

这里是用来验证接口调用时候 的回滚操作。

package org.myyoung.cxzc.springboottransaction;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;
@RestControllerpublic class MyController {    @Autowired    private DemoService demoService;
    @RequestMapping("/norollback")    public Person noRollback(Person person) {        return demoService.savePersonWithoutRollBack(person);    }
    @RequestMapping("/rollback")    public Person rollback(Person person) {        return demoService.savePersonWithRollBack(person);    }}


#运行项目

1.回滚

浏览器中输入:
http://localhost:8080/rollback?name=程序职场&time=8&detail=专注spring boot 小程序 Flutter&writer=爬行蜗牛

效果如下:


此时查询数据库 里面的数据没有插入,已经做了回滚

1.不回滚

浏览器中输入:
http://localhost:8080/norollback?name=程序职场&time=8&detail=专注spring boot 小程序 Flutter&writer=爬行蜗牛
效果如下:


此时查询数据库 里面的数据插入一条,因为这里没有做回滚。
 

ok,本篇内容到这里就完成了,如果小伙伴还有疑问,可以 关注我,我们一起进步

参考:
1. 《JavaEE开发的颠覆者 Spring Boot实战》

本案例下载地址:

https://github.com/ProceduralZC/itcxzc/tree/master/springboottransaction

作者:小小蒲公英

猜你喜欢

转载自blog.csdn.net/jianpengxuexikaifa/article/details/104523139
今日推荐