目录

  • ​​Spring事务管理​​
  • ​​1.事务管理级别​​
  • ​​2.事务传播机制​​
  • ​​3.声明式事务管理​​
  • ​​3.1基于XML方式的配置​​
  • ​​3.2 基于注解方式的配置​​

Spring事务管理

1.事务管理级别


Spring的事务隔离级别有四个:READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ和SERIALIZABLE。


  • READ_UNCOMMITTED:允许一个事务读取到另一个事务未提交的数据
  • READ_COMMITTED:一个事务只能读取到已经提交后的数据
  • REPEATABLE_READ:一个事务可以多次从数据库读取某条记录,而且多次读取的那条记录都是一致的,除非事务本身发生改变
  • SERIALIZABLE:不允许读取、修改

2.事务传播机制


spring事务的传播机制有七种:REQUIRED、REQUIRES_NEW、NESTED、SUPPORTS、NOT_SUPPORTED、MANDATORY和NEVER。


  • REQUIRED:如果上层有事务则加入该事务,没有就创建新事务
  • SUPPORTS:如果上层有事务则加入该事务,没有就以非事务方式执行
  • REQUIRES_NEW:如果上层有事务则挂起当前事务,没有就创建新事务
  • NOT_SUPPORTED:如果上层有事务则挂起当前事务,没有就以非事务方式执行
  • NEVER:如果上层有事务则抛出异常,没有就以非事务方式执行
  • MANDATORY:如果上层有事务则加入该事务,没有就抛出异常
  • NESTED:如果上层有事务则嵌套该事务执行,没有就创建新事务

3.声明式事务管理

3.1基于XML方式的配置

3.1.1 将Spring提供的事务管理配置交给Spring容器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

3.1.2 通过Spring jdbc提供的tx标签,声明事务管理策略

  • 头文件中添加tx的约束条件和命名空间
xmlns:tx="http://www.springframework.org/schema/tx"

http://www.springframework.org/schema/tx
https://www.springframework.org/schema/tx/spring-tx.xsd">
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="insert*" isolation="REPEATABLE_READ" propagation="REQUIRED"/>
<tx:method name="select*" isolation="REPEATABLE_READ" propagation="SUPPORTS"/>
</tx:attributes>
</tx:advice>

3.1.3 将事务管理策略以AOP配置应用于service操作方法

<aop:config>
<aop:pointcut id="crud" expression="execution(* com.gyh.service.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="crud"/>
</aop:config>

3.2 基于注解方式的配置

3.2.1 配置事务管理类并交给Spring容器

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

3.2.2 声明使用注解方式配置

<tx:annotation-driven transaction-manager="transactionManager"/>

3.2.3 在需要Spring进行事务管理的方法上添加注解

@Transactional   
public List<User> listUsers() {
return userDao.selectUser();
}