Spring 事务 (编程式 & 声明式, Spring 事务传播机制)

简介: Spring 事务 (编程式 & 声明式, Spring 事务传播机制)

事务

事务是一组操作的集合, 是一个不可分割的整体

事务会把所有的操作作为一个整体, 一起向数据库提交或是撤销操作请求. 所以这组操作要么同时成功, 要么同时失败

Spring 中事务的实现

  1. 编程式 (手动写代码操作事务)
  2. 声明式 (通过注解自动开启和提交事务)

编程式事务

  1. 开启事务 / 获取事务, 通过两个 Spring 内置对象获取
  • DataSourceTransactionManager 事务管理器, 用来获取, 提交或回滚事务
  • TransactionDefinition 定义事务的属性, 事务隔离级别, 事务传播机制, 回滚规则 …
  1. 提交事务
  2. 回滚事务

Spring 通过 DataSourceTransactionManager (事务管理器) 和 TransactionDefinition (事务的属性) 来获取事务

@Controller
public class BasicController {
  // 获取事务管理器
    @Autowired
    private DataSourceTransactionManager dataSourceTransactionManager;
    
  // 定义事务的属性
    @Autowired
    private TransactionDefinition transactionDefinition;

    @RequestMapping("/registry")
    public String registry() {
        // 获取事务 / 开启事务 (transactionStatus 为事务的一个状态, 可以理解为数据库的一个快照)
        TransactionStatus transactionStatus =
                dataSourceTransactionManager.getTransaction(transactionDefinition);

        // 业务逻辑
        User user = new User();
        user.setAge(18);
        user.setName("zrj");
    
    //提交事务
        dataSourceTransactionManager.commit(transactionStatus); 
        
        //回滚事务
//        dataSourceTransactionManager.rollback(transactionStatus); 
        return "ok";
    }
}

声明式事务

使用注解 @Transactional

既是类注解, 也是方法注解

会对注解范围内所有的 public 修饰的方法 生效

@Transactional :

如果方法执行过程中, 出现异常, 且未被捕获, 就进行事务回滚.

如果异常被程序捕获, 则方法对异常无感知, 认为本次执行成功, 就会进行事务提交. 若异常被捕获仍想回滚:

  • 将捕获的异常再次抛出
  • 手动回滚事务 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@RestController
public class PathVariableController {
    @Transactional()
    @RequestMapping("/registry")
    public String registry() {
        User user = new User();
        user.setAge(18);
        user.setName("zrj");
        return "ok";
    }
}

@Transactional 注解的常用属性

  1. rollbackFor : 异常回滚属性. 执行能够触发事务回滚的异常类型, 默认只有 运行时异常和 error 才会触发事务回滚, 其他类型异常并不会触发回滚操作
  1. Isolation : 事务的隔离级别. 默认为 Isolation.DEFAULT
  2. propergation : 事务的传播机制, 默认值为 Propergation.REQUIRED

事务的隔离级别解决 多个事务同时调用一个数据库的问题

事务的传播机制解决 一个事务在多个节点(方法)中传播的问题

Spring 事务的传播机制 – 7种

Propergation.REQUIRED : 如果当前存在事务, 则加入该事务, 如果当前不存在事务, 则创建一个事务

Propergation.SUPPORTS : 如果当前存在事务, 就加入该事务, 如果当前不存在事务,就以非事务的方式继续执行

Propergation.MANDATORY : 强制性, 如果当前存在事务, 就加入该事务, 如果当前不存在事务, 就报错

Propergation.REQUIED_NEW : 创建一个新事务, 如果当前存在事务, 就将当前事务挂起

Propergation.NOT_SUPPORTED :非事务的方式运行, 如果当前存在事务, 就将当前事务挂起

Propergation.NEVER : 以非事务的方式运行, 如果当前存在事务, 就抛出异常

Propergation.NESTED : 如果当前存在事务, 则创建一个事务作为当前事务的嵌套事务/子事务来运行, 如果没有事务, 则创建一个事务


NESTED & REQUIRED

  • 如果事务全部执行成功, 二者的结果是一样的
  • 如果事务部分执行成功, 部分执行失败, REQUIRED 加入事务 会导致整个事务 全部回滚, NESTED 嵌套事务 可以实现 部分回滚 (savepoint 机制)

目录
相关文章
|
2月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
3月前
|
Java 关系型数据库 MySQL
Spring 事务失效场景总结
Spring 事务失效场景总结
46 4
|
6天前
|
Java 数据库连接 数据库
spring复习05,spring整合mybatis,声明式事务
这篇文章详细介绍了如何在Spring框架中整合MyBatis以及如何配置声明式事务。主要内容包括:在Maven项目中添加依赖、创建实体类和Mapper接口、配置MyBatis核心配置文件和映射文件、配置数据源、创建sqlSessionFactory和sqlSessionTemplate、实现Mapper接口、配置声明式事务以及测试使用。此外,还解释了声明式事务的传播行为、隔离级别、只读提示和事务超时期间等概念。
spring复习05,spring整合mybatis,声明式事务
|
9天前
|
Java 测试技术 数据库
Spring事务传播机制(最全示例)
在使用Spring框架进行开发时,`service`层的方法通常带有事务。本文详细探讨了Spring事务在多个方法间的传播机制,主要包括7种传播类型:`REQUIRED`、`SUPPORTS`、`MANDATORY`、`REQUIRES_NEW`、`NOT_SUPPORTED`、`NEVER` 和 `NESTED`。通过示例代码和数据库插入测试,逐一展示了每种类型的运作方式。例如,`REQUIRED`表示如果当前存在事务则加入该事务,否则创建新事务;`SUPPORTS`表示如果当前存在事务则加入,否则以非事务方式执行;`MANDATORY`表示必须在现有事务中运行,否则抛出异常;
42 4
Spring事务传播机制(最全示例)
|
5天前
|
Java Spring
Spring 事务传播机制是什么?
Spring 事务传播机制是什么?
14 4
|
2月前
|
XML Java 数据格式
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
这篇文章是Spring5框架的AOP切面编程教程,通过XML配置方式,详细讲解了如何创建被增强类和增强类,如何在Spring配置文件中定义切入点和切面,以及如何将增强逻辑应用到具体方法上。文章通过具体的代码示例和测试结果,展示了使用XML配置实现AOP的过程,并强调了虽然注解开发更为便捷,但掌握XML配置也是非常重要的。
Spring5入门到实战------11、使用XML方式实现AOP切面编程。具体代码+讲解
|
2月前
|
Java 程序员 数据库连接
女朋友不懂Spring事务原理,今天给她讲清楚了!
该文章讲述了如何解释Spring事务管理的基本原理,特别是针对女朋友在面试中遇到的问题。文章首先通过一个简单的例子引入了传统事务处理的方式,然后详细讨论了Spring事务管理的实现机制。
女朋友不懂Spring事务原理,今天给她讲清楚了!
|
2月前
|
XML Java 数据库
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
这篇文章是Spring5框架的实战教程,详细介绍了事务的概念、ACID特性、事务操作的场景,并通过实际的银行转账示例,演示了Spring框架中声明式事务管理的实现,包括使用注解和XML配置两种方式,以及如何配置事务参数来控制事务的行为。
Spring5入门到实战------15、事务操作---概念--场景---声明式事务管理---事务参数--注解方式---xml方式
|
2月前
|
前端开发 Java 数据库连接
一天十道Java面试题----第五天(spring的事务传播机制------>mybatis的优缺点)
这篇文章总结了Java面试中的十个问题,包括Spring事务传播机制、Spring事务失效条件、Bean自动装配方式、Spring、Spring MVC和Spring Boot的区别、Spring MVC的工作流程和主要组件、Spring Boot的自动配置原理和Starter概念、嵌入式服务器的使用原因,以及MyBatis的优缺点。
|
2月前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
38 0
下一篇
无影云桌面