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"/>
posted @ 2021-12-30 20:58  言思宁  阅读(501)  评论(0编辑  收藏  举报