Spring Tx (一) (事务)

本文围绕Spring事务展开,介绍了其在应用层、驱动层、特性层和属性层的定义,阐述了事务的原子性、一致性、隔离性和持久性四大特性,还讲解了Spring为保证事务特性定义的6个属性,包括隔离级别和传播机制等,详细介绍了7种事务传播机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.事务的定义

在这里插入图片描述

  • 应用层: Spring-Mybatis
  • 驱动层: JDBC事务单数据库事务, JTA事务分布式事务
  • 特性层: ACID
  • 属性层: 事务名称, 隔离级别, 超时时间, 是否只读, 传播机制, 回滚机制

2.事务特性

  • 原子性(Atomicity):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚。–》主要涉及InnoDB事务。相关特性:事务的提交,回滚,信息表。

  • 一致性(consistency):数据库总是从一个一致性的状态转换到另一个一致性的状态。在事务开始前后,数据库的完整性约束没有被破坏。例如违反了唯一性,必须撤销事务,返回初始状态。–》主要涉及内部InnoDB处理,以保护数据不受崩溃,相关特性:双写缓冲、崩溃恢复。

  • 隔离性(isolation):每个读写事务的对象对其他事务的操作对象能相互分离,即:事务提交前对其他事务是不可见的,通常内部加锁实现。–》主要涉及事务,尤其是事务隔离级别,相关特性:隔离级别、innodb锁的底层实现细节。

  • 持久性(durability):一旦事务提交,则其所做的修改会永久保存到数据库。–》涉及到MySQL软件特性与特定硬件配置的相互影响,相关特性:4个配置项:双写缓冲开关、事务提交刷新log的级别、binlog同步频率、表文件;写缓存、操作系统对于fsync()的支持、备份策略等。

3.事务的属性

要保证事务的ACID特性,spring给事务定义了6个属性,对应于声明式事务注解(org.springframework.transaction.annotation.Transactional)@Transactional(key1=,key2=…)

  • 事务名称:用户可手动指定事务的名称,当多个事务的时候,可区分使用哪个事务。对应注解中的属性value、transactionManager
  • 隔离级别: 为了解决数据库容易出现的问题,分级加锁处理策略。 对应注解中的属性isolation
  • 超时时间: 定义一个事务执行过程多久算超时,以便超时后回滚。可以防止长期运行的事务占用资源.对应注解中的属性timeout
  • 是否只读:表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.对应注解中的属性readOnly
  • 传播机制: 对事务的传播特性进行定义,共有7种类型。对应注解中的属性propagation
  • 回滚机制:定义遇到异常时回滚策略。对应注解中的属性rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName
3.1 隔离级别

在这里插入图片描述

3.2 传播机制

org.springframework.transaction包下有一个事务定义接口TransactionDefinition,定义了7种事务传播机制

  • 1.PROPAGATION_REQUIRED
    支持当前事务;如果不存在,创建一个新的。类似于同名的EJB事务属性。这通常是事务定义的默认设置,通常定义事务同步作用域。

  • 2.PROPAGATION_SUPPORTS
    支持当前事务;如果不存在事务,则以非事务方式执行。类似于同名的EJB事务属性。
    注意:
    对于具有事务同步的事务管理器,PROPAGATION_SUPPORTS与没有事务稍有不同,因为它可能在事务范围内定义了同步。因此,相同的资源(JDBC的Connection、Hibernate的Session等)将在整个指定范围内共享。注意,确切的行为取决于事务管理器的实际同步配置!
    小心使用PROPAGATION_SUPPORTS!特别是,不要依赖PROPAGATION_REQUIRED或PROPAGATION_REQUIRES_NEW,在PROPAGATION_SUPPORTS范围内(这可能导致运行时的同步冲突)。如果这种嵌套不可避免,请确保适当地配置事务管理器(通常切换到“实际事务上的同步”)。

  • 3.PROPAGATION_MANDATORY
    支持当前事务;如果当前事务不存在,抛出异常。类似于同名的EJB事务属性。
    注意:
    PROPAGATION_MANDATORY范围内的事务同步总是由周围的事务驱动。

  • 4.PROPAGATION_REQUIRES_NEW
    创建一个新事务,如果存在当前事务,则挂起当前事务。类似于同名的EJB事务属性。
    注意:实际事务挂起不会在所有事务管理器上开箱即用。这一点特别适用于JtaTransactionManager,它需要TransactionManager的支持。
    PROPAGATION_REQUIRES_NEW范围总是定义自己的事务同步。现有同步将被挂起并适当地恢复。

  • 5.PROPAGATION_NOT_SUPPORTED
    不支持当前事务,存在事务挂起当前事务;始终以非事务方式执行。类似于同名的EJB事务属性。
    注意:实际事务挂起不会在所有事务管理器上开箱即用。这一点特别适用于JtaTransactionManager,它需要TransactionManager的支持。
    事务同步在PROPAGATION_NOT_SUPPORTED范围内是不可用的。现有同步将被挂起并适当地恢复。

  • 6.PROPAGATION_NEVER
    不支持当前事务;如果当前事务存在,抛出异常。类似于同名的EJB事务属性。
    注意:事务同步在PROPAGATION_NEVER范围内不可用。

  • 7.PROPAGATION_NESTED
    如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,类似PROPAGATION_REQUIRED(创建一个新的)。EJB中没有类似的功能。
    注意:实际创建嵌套事务只对特定的事务管理器有效。开箱即用,这只适用于 DataSourceTransactionManager(JDBC 3.0驱动)。一些JTA提供者也可能支持嵌套事务。

Spring TX事务管理是Spring框架提供的种管理事务的机制。Spring并不直接管理事务,而是通过提供多种事务管理器,将事务管理的职责委托给底层的持久化机制(如Hibernate或JTA等)来实现。 在Spring进行事务管理时,主要有两种方式:编程式事务管理和声明式事务管理。声明式事务管理是种常用的方式,它通过使用注解或配置文件的方式来定义事务的边界和行为。 要使用Spring事务管理,首先需要引入相关的库。然后,根据具体的需求,可以使用注解式的方式来管理事务。例如,可以在需要进行事务管理的方法或类上添加@Transactional注解,该注解会自动处理事务的开启、提交或回滚等操作。 下面是个使用Spring事务管理的示例代码: ```java package org.example; import org.example.service.AccountService; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Starter01 { public static void main(String[] args) { ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring01.xml"); AccountService accountService = (AccountService) applicationContext.getBean("accountService"); accountService.transfer(1, 100.0, 2); } } ``` 以上是个简单的示例,它演示了如何使用注解方式来管理Spring事务。在该示例中,通过获取ApplicationContext来获取AccountService bean,并调用其transfer方法来完成事务操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值