Spring中的事务控制
事务控制
Spring的事务控制:
JavaEE体系进行分层开发(full-satck), 事务控制处于业务层。Spring提供了分层设计中业务层的事务控制方法。
Spring的事务控制底层就是基于AOP,它通过基于声明和基于注解两种方式实现事务的控制。
依赖的包:spring-tx-5.2.9.RELEASE.jar
一、Spring中事务控制
主要类:
PlatformTransactionManager接口:Spring的事务控制接口,定义了事务管理的规则。
getTransaction(TransactionDefinition): 根据事务的定义信息类,获取事务。
commit(): 提交事务。该方法完成开启事务,并提交事务。(setAutoCommit(false)+commit)
rollback(): 事务回滚。该方法完成事务的回滚并释放资源。(rollback+release)
DataSourceTransationManager类: 使用JDBC或iBatis操作数据库时的事务控制
HibernateTransactionManager类: 使用Hibernate操作数据库时的事务控制
TransactionDefinition接口:定义事务的属性
getIsolationLevel(): 获取事务的隔离级别
getPropagationBehavior():获取事务传播行为
getTimeout(): 获取事务的超时事件
isReadOnly(): 事务是否只读
事务的隔离级别:
ISOLATION_DEFAULT: 默认级别,使用数据库中的默认级别
ISOLATION_READ_UNCOMMITTED = 1:读未提交
ISOLATION_READ_COMMITTED = 2:读已提交,解决脏读问题
ISOLATION_REPEATABLE_READ = 4:可重复读,解决重复读取数据不一致问题
ISOLATION_SERIALIZABLE = 8:串行
事务的传播行为:
当一个方法被另一个方法调用时,这个方法是否被事务控制。
分为7种:
REQUIRED:表示当前方法必须由事务控制才能执行。如果存在事务,则该方法被事务控制,否则会新建一个事务。 (默认值)
SUPPORTS:当前方法不需要被事务控制就能执行。如果存在事务,则该方法被事务控制。
MANDATORY:表示当前方法必须由事务控制。如果当前没有事务,就抛出异常
REQUERS_NEW: 表示当前方法必须由它自己的事务控制。如果存在事务,把当前事务挂起。
NOT_SUPPORTED:以非事务方式执行操作。如果存在事务,就把当前事务挂起
NEVER:以非事务方式运行,如果当前存在事务,抛出异常
NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行 REQUIRED 类似的操作。
二、声明式事务控制
使用步骤:
1.配置事务管理对象:管理JDBC操作
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2.配置事务管理器中事务的属性
事务的属性包括:
name: 切入点中被事务控制的方法名。*代表任意方法。
isolation: 事务的隔离级别。默认时DEFAULT,表示数据库的默认隔离级别
propagation: 传播行为。默认REUIRED
read-only:事务对数据库是否是只读。
timeout:超时事件。默认-1,表示永不超时。或者是超时的毫秒。
rollback-for: 用于指定一个异常,当产生该异常时,事务回滚。默认任何异常都回滚。
no-rollback-for: 指定一个异常,当产生该异常时,事务不回滚。默认任何异常都回滚。
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="*" isolation="DEFAULT" propagation="REQUIRED" read-only="false"/>
</tx:attributes>
</tx:advice>
3.织入事务与切入点。
<!--3.配置事务的织入,事务以AOP方式实现-->
<aop:config>
<aop:advisor advice-ref="txAdvice" pointcut="execution(* com.spring.twelve.service.*.*(..))"/>
</aop:config>
pointcut:表示要织入事务的方法。即切入点。
三、注解式事务控制
使用步骤:
1.在xml中,引入事务约束
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd"
2.在xml中,开启注解事务的驱动,并制定事务管理器
<tx:annotation-driven transaction-manager="txManager"/>
3.在类或方法中使用@Transactional配置事务
常用注解:
1.@Transactional注解
使用规则:@Transactional(propagation = Propagation.REQUIRED, readOnly = false, timeout = -1, rollbackFor = {}, noRollbackFor = {})
配置位置:
注解使用在类上时,该类的所有方法都被事务控制。
注解使用在方法上时,该方法被事务控制。
方法上有注解,类上也有注解时,方法优先使用方法上的注解用于事务控制。
2.@EnableTransactionManagement注解:和@Configuration一起用,表名这个类是注解类,并且支持事务。
相当于<tx:annotation-driven transaction-manager="txManager"/>