事务
ACID特性
- Resource Manager:简称RM,负责存储并管理系统数据资源的状态,如数据库服务器,JMS消息服务器。
- Transaction Processing Monitor:简称TPM或TP Monotor,负责在分布式事务中协调多个RM的事务处理,随着软件开发技术的发展,TP Monitor由原来基于过程式的设计与实现,转为面向对象的更趋于模块化的设计和实现。Java中的J2EE规范中的应用服务器(Application Server)就是TP Monitor。
- Transaction Manager:简称TM,是TP Minotor的核心模块,直接负责多RM之间事务处理的协调工作,并且提供事务界定(Transaction Demarcation)、事务上下文传播(Transaction Context Propagation)等功能接口。
- Application:以独立形式存在或者运行于容器内的应用程序,可以认为是事务边界的触发点。
根据整个事务中涉及的RM多寡,可以将事务分为两类,即全局事务(Global Transaction)和局部事务(Local Transaction)。在这两类事务中事务参与者是不同的
Global Transaction
如果整个事务处理过程有多个RM参与,那么就需要引入TP Monitor来协调多个RM之间的事务处理。TP Monitor采用两阶段提交(Two-Phase Commit)协议来保证整个事务的ACID属性。这种场景就被称为全局事务或分布式事务(Distributed Transaction).
所有应用程序提交的事务请求,需要通过TP Monitor的调配后,直接有TM统一协调,TM将使用两阶段提交协议雷协调多RM之间的事务处理。
Local Transaction
如果当前事务只有一个RM参与其中,我们就可以称当前事务为局部事务。比如在当前事务中只对一个数据库进行更新,或者只向一个消息队列中发送消息的情况,都属于局部事务。
由于在事务中只包含一个RM,因此没有必要引入相应的TP Monitor来帮助协调管理多个RM之间的事务管理。应用程序可以直接与RM打交道。通常情况下,相应的RM都有内置的事务支持,所以在局部事务当中,我们更倾向于直接使用RM的内置事务支持。这样不仅可以极大地减少事务处理的复杂度,也避免了引入TP Monitor来协调多个RM之间事务处理的性能负担。
局部事务与全局事务的主要区别在于事务中涉及多少RM,而不是系统实际有多少RM。即使系统中存在多个数据库(即RM),只要当前事务只更新一个数据库的数据,那么当前事务就应该算局部事务,而不是全局事务(虽然也可以启用全局事务)。
实际上在针对单一事务资源的事务管理,我们可以在局部事务中直接使用RM内置的事务支持,也可以引入TP Monitor在分布式事务中进行事务管理。通常情况下,各TP Monitor在实现的时候回检测参与事务的RM数目,如果只有单一的RM参与,TP Monitor会做一定的优化,避免采用两阶段提交协议的负担。单即便如此,针对单一事务资源参与的事务,直接采用局部事务中的RM内置的事务支持,无论是从复杂度,还是效率上来看,都更胜一筹。
Spring事务
Spring事务将开发过程中的事务管理相关的关注点进行适当分离,通过Spring的事务框架,我们可以按照统一的编程模型进行事务编程,不用关心所使用的数据访问技术以及具体要访问什么类型的事务资源。Spring事务框架可以很好的和Spring提供的数据访问支持紧密结合。
Spring的事务框架设计理念的基本原则是:让事务管理的关注点与数据访问关注点相分离解耦。
- 当在业务层使用事务的抽象API进行事务界定时,不需要关心事务将要加诸于上的事务资源是什么,对不同的事务资源的管理将由相应的框架实现类操心。
- 当在数据访问层对可能参与事务的数据资源进行访问时,只需要使用相应的数据访问API进行数据访问,不需要关心当前的事务资源如何参与事务或者是否需要参与事务,同样由事务框架类处理。
Spring事务核心类
Spring事务主要包括三个核心接口
- org.springframework.transaction.PlatformTransactionManager:事务管理器
- org.springframework.transaction.TransactionDefinition:事务定义的对象,提供事务相关信息的获取方法,包括隔离级别、传播行为等。
- org.springframework.transaction.TransactionStatus:事务的状态,描述某一时间点事务的状态信息。
PlatformTransactionManager
PlatformTransactionManager 接口是Spring提供的平台事务管理器,用于管理事务。该接口中提供三个事务操作方法,具体如下。
- TransactionStatus getTransaction(TransactionDefinition definition):用于读取事务状态信息
- void commit(TransactionStatus status):提交事务
- void rollback(TransactionStatus status):回滚事务
TransactionDefinition
TransactionDefinition 接口是事务定义(描述)的对象,它提供了事务相关信息获取的方法,其中包括五个操作,具体如下。
String getName():获取事务对象名称。
int getIsolationLevel():获取事务的隔离级别。
int getPropagationBehavior():获取事务的传播行为。
int getTimeout():获取事务的超时时间。
boolean isReadOnly():获取事务是否只读。TransactionStatus
TransactionStatus 接口是事务的状态,它描述了某一时间点上事务的状态信息。其中包含六个操作,具体如表 2 所示。
| 名称 | 说明 |
|---|---|
| void flush() | 刷新事务 |
| boolean hasSavepoint() | 获取是否存在保存点 |
| boolean isCompleted() | 获取事务是否完成 |
| boolean isNewTransaction() | 获取是否是新事务 |
| boolean isRollbackOnly() | 获取是否回滚 |
| void setRollbackOnly() | 设置事务回滚 |
