赞
踩
Spring Boot 中的事务处理
感兴趣的朋友可以去关注一下。
文章总览
前面几篇文章主要讲解了在 Spring Boot 项目中对数据层的操作,本章节将介绍在 Spring Boot 项目中如何进行事务处理。所有的数据访问技术都离不开事务处理,否则将会造成数据不一致,在目前企业级应用开发中,事务管理是必不可少的。
知识点
数据库事务介绍
声明式事务
Spring Boot 处理数据库事务
环境
JDK 1.8 或者更高版本
Spring Boot 2.1.0-RELEASE
Maven 3+
MySQL
数据库事务简介
数据库事务是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。 事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。
通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的 ACID(原子性、一致性、隔离性和持久性)属性,事务是数据库运行中的逻辑工作单位,由数据库中的事务管理子系统负责事务的处理。
Spring Boot 事务机制
首先需要明确的一点是 Spring Boot 事务机制实质上就是 Spring 的事务机制,是采用统一的机制处理来自不同数据访问技术的事务处理,只不过 Spring Boot 基于自动配置的特性作了部分处理来节省开发者的配置工作,这一知识点我们会结合部分源码进行讲解。
Spring 事务管理分两种方式:
编程式事务,指的是通过编码方式实现事务;
声明式事务,基于 AOP,将具体业务逻辑与事务处理解耦。
声明式事务
声明式事务是建立在 AOP 机制之上的,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点,就是通过 AOP 机制将具体业务逻辑与事务处理解耦,不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,因此在实际使用中声明式事务用的比较多。
声明式事务有两种方式:一种是在 XML 配置文件中做相关的事务规则声明;另一种是基于 @Transactional 注解的方式(@Transactional 注解是来自 org.springframework.transaction.annotation 包),便可以将事务规则应用到业务逻辑中。
未使用 Spring Boot 时的事务配置
下面这个配置文件是普通的 SSM 框架整合时的事务配置,相信大家都比较熟悉这段配置代码:
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
expression="(execution(* com.ssm.demo.service.*.*(..)))"/>
通过这段代码我们也能够看出声明式事务的配置过程:
配置事务管理器
配置事务通知属性
配置事务切面
这样配置后,相关方法在执行时都被纳入事务管理下了,一旦发生异常,事务会正确回滚。
Spring Boot 项目中的事务控制
在 SpringBoot 中,建议采用注解 @Transactional 进行事务的控制,只需要在需要进行事务管理的方法或者类上添加 @Transactional 注解即可,接下来我们来通过代码讲解。
新建 TransactionTestService.java
首先新建 service 包作为业务代码包,事务处理一般在 service 层做,当然在 controller 层中处理也可以,但是建议还是在业务层进行处理,之后在包中新建 TransactionTestService 类,代码如下:
```java
package com.lou.springboot.service;
import com.lou.springboot.dao.UserDao;
import com.lou.springboot.entity.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
@Service
public class TransactionTestService {
@Resource
UserDao userDao;
public Boolean test1() {
User user = new User();
user.setPassword("test1-password");
user.setName("test1");
// 在数据库表中新增一条记录
userDao.insertUser(user);
// 发生异常
System.out.println(1 / 0);
return true;
}
@Transactional
public Boolean test2() {
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。