首页 > 其他分享 >Spring 事务管理

Spring 事务管理

时间:2023-07-23 13:34:44浏览次数:39  
标签:事务管理 回滚 Spring Transactional 事务 id public

事务

事务是一组操作的集合,它是一个不可分割的单位,这些操作要么成功,要么失败。

操作

  • 开启事务(一组操作开始前,开启事务):start tranasction / begin ;
  • 提交事务(这组操作全部成功,提交事务):commit
  • 回滚事务(中间任何一个操作出现异常,回滚事务):rollback

一、Spring 事务管理

当涉及多表连接的时候,需要用到@Transaction,一般情况下用在方法中

# 开启事务管理日志
logging:
  level:
    org.springframework.jdbc.support.jdbcTransactionManager: debug
* 注解: @Transactional
* 位置: 业务(service)层的方法上、类上、接口上
* 作用: 将当前方法交给spring进行事务管理,执行方法前,开启事务;一、成功执行完毕,提交事务;二、出现异常,回滚事务 

// 方法
@Transactional
@Override
public void delete(Integer id) {
	deptMapper.deleteById(id);
	int i = 1 / 0; // 模拟抛出异常
	empMapper.deleteById(id);
}

// 接口
@Transactional
public interface DeptService {}

// 类
@Service
public class DeptServiceImpl implements DeptService {}

在spring框架当中就已经把事务控制的代码都已经封装好了,并不需要我们手动实现。我们使用了spring框架,我们只需要通过一个简单的注解@Transactional就搞定了。

Transactional 注解

@Transactional作用:就是在当前这个方法执行开始之前来开启事务,方法执行完毕之后提交事务。如果在这个方法执行的过程当中出现了异常,就会进行事务的回滚操作。

@Transactional注解:我们一般会在业务层当中来控制事务,因为在业务层当中,一个业务功能可能会包含多个数据访问的操作。在业务层来控制事务,我们就可以将多个数据访问操作控制在一个事务范围内。

二、事务进阶

1. 事务属性-回滚 RollbackFor

  • 默认情况下,只有出现RuntimeException才会回滚异常。rollbackFor属性用于控制出现任何异常类型,回滚事务
@Transactional(rollbackFor = Exception.class) // 出现所有异常,进行事务回滚(Exception.class 可修改)
@Override
public void delete(Integer id) throws Exception {
	deptMapper.deleteById(id);
	if(true) {
		throw new Exception("出错....");
	}
	empMapper.deleteById(id);
}

2. 事务属性-传播行为 Propagation

事务传播行为:指的是当一个事务方法被另一个事务调用时,这个事务方法应该如何进行事务控制

@Transactional
public void a() {
	// ...
	userservice.b();
	// ...
}
@Transactional(propagetion = Propagation.REQUIRED) // 若有事务,则加入事务,若无则创建新事物(默认情况,定不定义都默认)
public void b() {
	// ...
}
  • REQUIRED:大部分情况下都是用该传播行为
  • REQUIRES_NEW:当我们不希望事物之间相互影响时,考研使用该传播行为。比如:下订单前需要记录日志,无论订单保存成功与否,都需要保证日志记录成功

标签:事务管理,回滚,Spring,Transactional,事务,id,public
From: https://www.cnblogs.com/bobowww/p/17574906.html

相关文章

  • SpringBoot 自动装载 Bean
    我们在工作中经常会遇到这样的场景,我们写了很多非常实用的工具类,这些类在多个项目工程中使用非常频繁。如果在每个要使用的项目工程中都去编写加载bean的代码的话,那么重复的代码就太多了。如果你想追求完美只写一份代码的话,使用SpringBoot的自动装载的特性是一个很不错的方案......
  • JVAA springboot 项目启动后,localhost加端口可以访问,但是外网IP不行// OCPP KYOHOON
     现象javaspringboot项目启动后,localhost(或127.0.0.1)加端口可以访问,但是使用外网IP却无法访问。   原因及解决方法springboot的配置文件(yml或properties)中缺少server.address的设置。解决方法:在springboot的配置文件中增加server.address的配置。yml配......
  • springboot整合activeMQ
    依赖<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4......
  • idea打包springboot项目,打包成war包,如何不把lib目录或指定jar打进去?
    1、在pom.xml文件中添加如下配置:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration>......
  • springboot3.0 从入门到高级学习路线,技术精讲?
    springboot3.0从入门到高级学习路线,技术精讲?学习SpringBoot3.0的技术精讲需要经历以下几个阶段:阶段一:基础知识学习1.Java基础:熟悉Java编程语言及面向对象的基本概念和语法。2.Spring基础:了解Spring框架的核心概念和基本用法,包括依赖注入、AOP等。3.SpringBoot基础:学习Spr......
  • 如何理解Spring的IOC和DI
    学习过Spring框架的人一定都会听过Spring的IoC(控制反转)、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IOC、DI这两个概念是模糊不清的,是很难理解的。今天我就谈谈我对IOC和DI的理解,希望对大家有帮助。1、IOC与DI介绍IOC是InversionofControl的缩写,翻译成中文是......
  • RabbitMQ(三)整合SpringBoot
    RabbitMQ(三)整合SpringBoot1整合RabbitMQ1导入依赖<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>2查看容器的自动配置......
  • 10道SpringBoot面试题
    SpringBoot我是JavaPub,专注于面试、副业,技术人的成长记录。以下是SpringBoot面试题,相信大家都会有种及眼熟又陌生的感觉、看过可能在短暂的面试后又马上忘记了。JavaPub在这里整理这些容易忘记的重点知识及解答,建议收藏,经常温习查阅。评论区见本系列《最少必要面试题》Sprin......
  • 如何动态修改 spring aop 切面信息?让自动日志输出框架更好用
    业务背景很久以前开源了一款auto-log自动日志打印框架。其中对于spring项目,默认实现了基于aop切面的日志输出。但是发现一个问题,如果切面定义为全切范围过大,于是v0.2版本就是基于注解@AutoLog实现的。只有指定注解的类或者方法才会生效,但是这样使用起来很不方便。......
  • SpringBoot整合Liquibase
    1、是什么?Liquibase官网Liquibase是一个开源的数据库管理工具,可以帮助开发人员管理和跟踪数据库变更。它可以与各种关系型数据库和NoSQL数据库一起使用,并提供多种数据库任务自动化功能,例如数据库迁移、版本控制和监控。Liquibase还提供了一个Web界面,可以方便地管理和跟踪数据库......