2021-02-04 10:49:25
浏览数 (1)
一、Spring 事务控制
1. 编程式事务控制三大对象
代码语言:javascript
复制① PlatformTransactionManager:事务管理器的接口
- 具体方法
* TransactionStatus getTransaction(TransactionDefinition definition) 获取事务状态信息
* void commit(TransactionStatus status) 提交事务
* void rallback(TransactionStatus status) 回滚事务
- 根据使用的方式不用,使用的实现类也不同
* Spring JDBC / Mybatis ---> DataSourceTransactionManager
* Hibernate ---> HibernateTransactionManager
② TransactionDefinition:定义了事务的相关属性
- 具体方法
* String getName() 获取事务对象名称
* int getIsolationLevel() 获取事务隔离级别
* int getPropagationBehavior() 获取事务传播行为
* int getTimeout() 获取事务超时时间
* boolean isReadOnly() 获取事务是否只读
# 注意
* 读写型事务:增删改
* 只读型事务:查
- 事务隔离级别
* ISOLATION_DEFAULT 默认,根据使用的数据库决定
* ISOLATION_READ_UNCOMMITTED 读未提交
* ISOLATION_READ_COMMITTED 读已提交
* ISOLATION_REPEATABLE_READ 可重复读
* ISOLATION_SERIALIZABLE 串行化
- 事务的传播行为
* REQUIRED【默认】:有事务就加入,没有事务就创建(增删改)
* SUPPORTS:有事务就加入,没有事务就以非事务执行(查)
···
- 超时时间
* 默认为 -1 没有时间限制
* 数值,以秒为单位
- 是否只读事务【readOnly】
* true 只读
* false 读写
③ TransactionStatus:事务的状态【无法修改,既定事实】
- 具体方法
* void flush() 刷新事务
* boolean hasSavepoint() 获取事务是否存在存储点
* boolean isCompleted() 获取事务是否完成
* boolean isNewTransaction() 获取事务是否为新的事务
* boolean isRoolbackOnly() 获取事务是否回滚
* void setRoolbackOnly() 设置事务回滚
2. 基于xml的声明式事务控制
代码语言:javascript
复制//导入相关依赖
<!-- 导入 jdbcTemplate 依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
<!-- 事务控制 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.5.RELEASE</version>
</dependency>
--------------------------------------------------------------------------
//引入 tx 命名空间
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"
--------------------------------------------------------------------------
//配置
<!-- 配置平台事务管理器 -->
/*
class根据使用的方式来决定实现类
底层使用 connection 来处理事务,所以需要注入 数据源
*/
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSources"/>
</bean>
--------------------------------------------------------------------------
<!-- 通知事务增强 -->
/*
tx:advice
指定唯一 id 标识
指定 事务管理器 会默认寻找 id 为 transactionManager 的事务管理器
tx:method
name:指定需要被管理的方法名,* 为通配符
isolation:事务隔离级别
propagation:事务传播方式
timeout:超时时间
read-only:是否只读
*/
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 设置事务属性信息 -->
<tx:attributes>
<tx:method name="test*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="6" read-only="false"/>
</tx:attributes>
</tx:advice>
--------------------------------------------------------------------------
<!-- 事务配置 aop 织入 -->
/*
底层使用 aop 将事务与方法结合
aop:advisor 事务特有的配置切面方式
*/
<aop:config>
<aop:pointcut id="myPointcut" expression="execution(* com.softwareMan.service.impl.*.*(..))"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="myPointcut"/>
</aop:config>
3. 基于注解的声明式事务控制
代码语言:javascript
复制① 开启事务注解驱动
* <tx:annotation-driven transaction-manager="transactionManager"/>
② 添加
* @Transactional(isolation = Isolation.REPEATABLE_READ,
propagation = Propagation.REQUIRED,
timeout = 6,
readOnly = false)
③ 注意
- 该注解可以作用于需要进行事务控制类或方法上
- 当类和方法都有该注解时,采用就近原则