springboot mysql 事务_11.Spring Boot 中的事务处理

Spring Boot 中的事务处理

baf7475f5b1549aa62b9d48d47142670.png

f2d8527bafad9a6f0519ee7246177285.png

感兴趣的朋友可以去关注一下。

文章总览

前面几篇文章主要讲解了在 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() {

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值