《Spring-事务管理》

事务就是以可控的方式对数据资源进行访问的一组操作


为了保证事务执行前后,数据资源处于正确的状态,需要满足四个属性ACID,Atomicity、Consistency、Isolation、Durability

  • 原子性:事务包含的全部操作是一个不可分割的整体
  • 一致性:分布式数据库,常处于不一致的状态
  • 隔离性:主要规定了各个事务之间相互影响的程度,主要面对数据资源的并发访问
  • 持久性:一旦整个事务操作成功提交,对数据所做的变更将被记载并不可逆转,也就是不能通过回滚恢复

隔离性

根据不同隔离级别,各个事务对于数据资源访问会有不同的行为

  • Read Uncommitted:最低的隔离级别,一个事务可以读取另一个事务没有提交的更新结果,追求高性能,但会出现脏读(一个事务读取了另一个事务回滚前的数据,这份数据就是脏数据)、不可重复读取(同一个事务在整个事务过程中对同一笔数据的读取结果不同)、幻读(同一个查询在整个事务过程中多次执行后,查询所得的结果集不同,幻读针对的是多笔记录)
  • Read Committed:大部分数据库采取的默认隔离级别,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可以访问到该结果,这种级别可以避免脏读,但是不能避免幻读和不可重复读
  • Repeatable Read:保证在整个事务的过程中,对同一笔数据的读写结果是相同的,无法避免幻读
  • Serializable:所有事务操作都必须依次顺序执行,可以避免所有问题,但是并发性下降,性能最差

大多数数据库都支持这四种隔离级别,Spring、JDBC等数据访问方式也允许为事务指定这四种隔离级别,但最终还是由底层的数据资源决定隔离级别

事务成员

  • Resource Manager:负责存储并管理系统数据资源的状态,比如数据库服务器
  • Transaction Processing Monitor:在分布式事务场景中协调多个RM的事务处理,如JTA(Java Transaction API)
  • Transaction Manager:是TP Monitor的核心模块,负责多RM之间事务处理的协调工作,并提供事务界定、事务上下文传播等接口
  • Application:事务边界的出发点

根据涉及RM的多寡,可以将事务分为全局事务局部事务

  • 局部事务:只有一个RM参与,比如只对一个数据库更新,或者向一个消息队列发送消息,这时候不需要TP Monitor参与,可以直接使用RM的事务支持
  • 全局事务:TP Monitor协调多个RM之间的事务管理,TP Monitor采取两阶段提交协议保证事务属性

Java平台的事务支持

在Java局部事务场景中,通过当前使用的数据访问技术所提供的基于connection的API(如JDBC的Connection和Hibernate的Session)来管理事务

在Java分布式事务管理上,主要通过JTA(Java Transaction API)或者JCA(Java Connector Architecture)提供支持。使用JTA进行分布事务管理有直接使用JTA接口的编程事务管理以及基于应用服务器的声明性事务管理

Java平台提供的事务管理依旧存在许多平台,如局部事务管理绑定到了具体的数据访问方式,这会导致事务管理代码和业务逻辑代码混杂在一起,事务异常不统一,