Spring事务管理的方式
Spring支持两种事务管理方式:编程式事务和声明式事务。
- 编程式事务:将事务代码和业务代码放在一起写,这样的耦合性太高, 开发中不建议使用。
- 声明式事务:将事务代码和业务代码隔离开发,然后通过一段配置将它们组装运行,最后达到事务控制的目的。
其实声明式事务就是通过AOP原理实现的。
Spring事务管理相关的API
-
PlatfromTransactionManager(平台事务管理器)
PlatfromTransactionManager是spring进行事务管理的一个根接口,我们要是用它的实现类来做事务管理。其中它的一个子类(DataSourceTransactionManager)可以对mybatis和jdbcTemplate进行实物管理。
-
TransactionDefinition(事务定义)
- 隔离级别:分为ISOLATION_READ_UNCOMMITTED(读未提交),ISOLATION_READ_COMMITTED(读已提交),ISOLATION_REPEATABLE_READ(可重复读),ISOLATION_SERIALIZABLE(串行化)。
- 传播行为:指的是当一个业务方法被另一个业务方法调用时,应该如何进行事务控制。
常用的是:PROPAGATION_REQUIRED(必须有事务,这是默认值),如果存在一个事务,则加入到当前事务,如果没有事务则开启一个新事务;PROPAGATION_SUPPORTS(支持有事务),如果存在一个事务,则加入当前事务,如果没有事务则进行非事务运行。 - 只读性:只读事务不能进行增、删和改的使用,只能查询使用。
- 超时时长:事务超时时间,该属性需要底层数据库的支持,如果底层数据库不支持计时则无法使用该属性,它的默认值是-1,代表无限制。
PlatformTransactionManager 通过读取TransactionDefinition中定义事务信息参数,来管理事务,管理之后会产生一些列的TransactionStatus。
声明式事务之XML版配置
<!--事务管理-->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--给事务管理器传递参数-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
name 指的是方法名
isolation="DEFAULT" 事务隔离级别 默认是用数据库的隔离级别
propagation="REQUIRED" 事务传播行为 默认是必须有事务
read-only="false" 事务只读 默认是(可读可写)
timeout="-1" 超时时间 默认不限制
no-rollback-for="" 指定一种异常,当发生时,事务不回滚
-->
<tx:method name="find*" read-only="true"/><!--指定以find开头的方法开启只读事务-->
<tx:method name="get*" read-only="true"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!--配置切面(切点 + 增强)-->
<aop:config>
<!--切点-->
<aop:pointcut id="pt" expression="execution(* com.itheima.service.impl.*.*(..))"/>
<!--切面
advisor 这是一个特殊的切面,只能用于事务控制
advice-ref 指向的是增强
pointcut-ref 指向切点
-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt"/>
</aop:config>
声明式事之注解版
- @Transactional:该注解标注在方法上,代表对该方法进行声明式事务管理;标注在类上,表示对该类下所有方法进行声明式事务管理。
- @EnableTransactionManagement:标注在配置类上,表示开启事务管理,相当于XML中的
< tx : annotation-driven/>