天天看点

Spring Tx (一) (事务)

文章目录

  • ​​1.事务的定义​​
  • ​​2.事务特性​​
  • ​​3.事务的属性​​
  • ​​3.1 隔离级别​​
  • ​​3.2 传播机制​​

1.事务的定义

Spring Tx (一) (事务)
  • 应用层: 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 传播机制

  • 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提供者也可能支持嵌套事务。