Transaction Managament(事务管理二、Spring事务)
Spring事务框架的优势
Spring事务框架将开放过程中事务管理相关的关注点进行了分离,对这些关注点进行了抽象分离。通过Spring框架我们只要按照统一的事务模型,不需要关心所使用的数据资源访问技术以及要访问什么类型的数据资源;并且,spring事务框架与spring提供的数据访问支持可以紧密结合;最主要的是,结合SpringAOP框架,Spring事务框架为我们带来了声名式事务管理,无需绑定到任何应用服务器上。
基本原则
让事务管理的关注点与数据访问的关注点分离
-
当业务层使用事务的抽象API进行事务界定的时候,不需要关系事务将作用到什么样的数据资源,对数据资源的管理将由相应的框架实现类来操心
-
当数据访问层对可能参与事务的数据资源进行访问的时候,只需要使用相应的数据API对数据访问即可,不需要关心被访问的数据资源如何参与或是否参与事务,这些将由事务框架类来操心
*
对开发人员来说,唯一需要关心的就是通过抽象后的事务管理API进行事务的界定*
Spring事务框架原型代码学习
- 核心接口
-
主要接口简单介绍
- PlatformTransactionManager : 负责界定事务边界。
- TransactionDefinition:负责定义事务相关属性(级别,传播行为)。
- TransactionStatus:负责事务生命周期的状态;对事务进行有限控制的介质
主要接口详细介绍
- TransactionDefinition 该接口定义的事务属性有:
- 事务的隔离级别(Isolation) ( [.aɪsə'leɪʃ(ə)n])
- 事务的传播行为(Propagation Behavior) ([ˌprɒpə'ɡeɪʃ(ə)n] ) ([bɪ'heɪvjər])
- 事务的超时时间(TimeOut)
- 是否为只读事务(ReadOnly)
-
TransactionDefinition内定义了5个常量用于标志可供选择的隔离级别。
- ISOLATION_DEFAULT:数据库默认隔离级别,通常为Read Committed
- ISOLATION_READ_UNCOMMITTED
- ISOLATION_READ_COMMITTED
- ISOLATION_REPEATABLE_READ
- ISOLATION_SERIALIZABLE
-
事务的传播行为(我们将在声名式事务中更多的依赖该属性)
-
概念:整个事务处理过程中所跨越的业务对象将以什么样的行为参与事务。
-
针对事务的传播行为,TransactionDefinition提供了以下几种方式
- PROPAGATION_REQUIRED:如果当前存在一个事务,则加入。否则,创建一个新的事务。通常作为默认的事务传播行为
- PROPAGATION_SUPPORTS:如果当前存在一个事务,则加入。否则,直接执行。
- PROPAGATION_MANDATORY:强制要求当前必须有事务,否则抛出异常。(如果某个方法支持事务,但自身又不管理事务的提交或回滚,则适合采用此传播行为)
- PROPAGATION_REQUIRES_NEW:不管当前是否存在事务,都将创建新的事务。如果当前存在事务,则将该事务挂起(suspend)。(适合场景:自身业务需要事务支持,但又不希望自身的提交或回滚影响到外层业务。)
- PROPAGATION_NOT_SUPPORTED:不支持当前事务,在没有事务的情况下执行。如果当前存在事务,当前事务原则上需要挂起。
- PROPAGATION_NEVER:永远不需要当前存在事务,否则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务A,则再创建一个A的内部子事务B(此时B也称作A的嵌套事务(sub-transaction));在B的整个生命周期内,A将处于活跃状态,不会被挂起,如果B回滚,会影响外层事务A同样回滚。如果当前不存在事务,则创建事务并在其中执行。
-
TransactionStatus 定义表示整个事务处理过程中的事务状态。具体我们可以使用它完成以下工作:
- 使用它提供的方法查询事务状态
- 通过setRollbackOnly()方法标记当前事务,以使其回滚。
- 如果相应的PlatformTransactionManager支持Savepoint,可以通过transactionStatus创建内部事务。
(Spring事务框架内部主要使用的实现类是:DefaultTransactionStatus)
-
PlatforTransactionManager
PlatformTransactionManager整个抽象体系基于Strategy模式(策略模式)。由它对事务的界定做出进行统一抽象,而具体的界定策略则交由实现类实现。
-