spring-tx 笔记

spring transaction 笔记

事务的特性(ACID)

原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一整个交易中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。交易在执行过程中发生错误,会被回复(Rollback)到交易开始前的状态,就像这个交易从来没有执行过一样。
一致性:在交易开始之前和交易结束以后,数据库的完整性限制没有被破坏。
隔离性:两个交易的执行是互不干扰的,一个交易不可能看到其他交易运行时,中间某一时刻的数据。
持久性:在交易完成以后,该交易对数据库所作的更改便持久地保存在数据库之中,并不会被回复。

spring的事务API

PlatformTransactionManager

PlatformTransactionManager(平台事务管理器),用于事务管理的一组API

image.png

spring提供的几组实现

  1. DataSourceTransactionManager:适用于使用JDBC和iBatis进行数据持久化操作的情况。
  2. HibernateTransactionManager:适用于使用Hibernate进行数据持久化操作的情况。
  3. JpaTransactionManager:适用于使用JPA进行数据持久化操作的情况。

TransactionDefinition

TransactionDefinition(事务定义),定义了事务的一些基础信息,如超时时间、隔离级别、传播属性等。事务的定义包含:事务的隔离级别、事务的传播行为、超时时间设置、是否只读。

事务隔离级别

TransactionDefinition.ISOLATION_DEFAULT:这是默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
TransactionDefinition.ISOLATION_READ_UNCOMMITTED:该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能防止脏读和不可重复读,因此很少使用该隔离级别。
TransactionDefinition.ISOLATION_READ_COMMITTED:该隔离级别表示一个事务只能读取另一个事务已经提交的数据。该级别可以防止脏读,这也是大多数情况下的推荐值。
TransactionDefinition.ISOLATION_REPEATABLE_READ:该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同。即使在多次查询之间有新增的数据满足该查询,这些新增的记录也会被忽略。该级别可以防止脏读和不可重复读。
TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。

事务传播行为

TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。

TransactionStatus

PlatformTransactionManager.getTransaction(…) 方法返回一个 TransactionStatus 对象。返回的TransactionStatus 对象可能代表一个新的或已经存在的事务(如果在当前调用堆栈有一个符合条件的事务)。TransactionStatus 接口提供了一个简单的控制事务执行和查询事务状态的方法。该接口定义如清单3所示:

TransactionStatus 接口中定义的主要方法

public interface TransactionStatus{ boolean isNewTransaction(); void setRollbackOnly(); boolean isRollbackOnly();}

事务的使用方式

image.png

环境搭建

装配DataSource

根据实际使用的事务使用策略装配事务管理器,mybatis、jdbc使用DataSourceTransaction,Hibernate使用HibernateTransaction

编程式事务管理

装配TranstactionTemplate,注入事务管理器,注入传播行为和隔离级别

在需要实现事务的类里面注入TranstactionTemplate,调用其execute方法

声明式事务管理

利用aop实现的事务管理,有三种方式

TransactionProxyFactoryBean(不要用,繁琐)

  1. 装配TransactionProxyFactoryBean(这个类实现了FactoryBean,调用这个bean得到的不是这个类的实例,而是FactoryBean的getObject()),注入目标对象,注入事务管理器,注入transactionAttribute(这个属性是Properties,key为需要事务的方法,value为传播行为,隔离级别,只读)

XML的基于AspectJ声明事务

  1. 使用声明事务管理通知,注入事务管理器、事务属性(传播行为、隔离级别等)
  2. 使用aop将通知织入到切入点

注解的基于AspectJ声明事务


在需要事务的地方添加@Transaction注解并注入事务属性

你可能感兴趣的:(spring-tx 笔记)