Spring 事务
1.事务
逻辑上一组操作,要么一起成功,要么一起失败。
2.事务的特性
原子性,一致性,隔离性(并发事务之间数据相互隔离),持久性(事务提交后,永久保存在数据库)
3.Spring事务接口
-
PlatformTransactionManager 事务管理器
-
TransactionDefinition 事务定义信息
-
TransactionStatus 事务具体运行状态
(1)PlatformTransactionManager
Spring 为不同的持久化框架提供了不同的PlatformTransactionManager 接口实现类
(2) TransactionDefinition
事务隔离级别
-
脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据是无效的。
-
不可重复度:在同一事务中,多次读取同一数据返回的结果有所不同。
-
虚读/幻读:一个事务读取了几行记录后,另一个事务插入一些记录,幻读就发生了。在后来的查询中,第一个事务就会发现有些原来没有的记录。
隔离级别:
-
READ_UNCOMMITED:级别最低,上述都有可能发生。
-
READ_COMMITED:允许在并发事务已经提交后读取,可防止脏读。
-
REPEATABLE_READ:对相同字段的多次读取是一致的,除非事务被事务本身改变。可以防止脏、不可重复读,幻读仍有可能发生。
-
SERIALIZABLE: 完全服从 ACID 的隔离级别,确保不发生脏,幻,不可重复读。典型的通过完全锁定在事务中涉及到数据表来完成的。
-
DEFAULT: 数据库默认的隔离级别,MySQL 为 REPEATABLE_READ。
事务的传播行为:
解决业务层方法之间的相互调用的问题
-
PROPAGATION_REQUIRED: 支持当前事务,如果不存在,就新建一个。
-
PROPAGATION_SUPPORTS: 支持当前事务,如果不存在
-
PROPAGATION_MANDATORY:支持当前事务,如果不存在,就抛出异常。
-
PROPAGATION_REQUIRES_NEW:如果有事务存在,挂起当前事务,创建一个新的事务。
-
PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果有事务存在,挂起当前事务。
-
PROPAGATION_NEVER:以非事务方式运行,如果有事务存在,抛出异常。
-
PROPAGATION_NESTED:如果当前事务存在,则嵌套事务执行。
(3)TransactionStatus
4.Spring 事务管理
(1) 使用 XML 配置声明式事务,Spring 的声明式事务是通过 AOP 实现的。
<!-- 配置业务层代理 -->
<bean id = "accountServiceProxy" class = "org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--配置目标对象-->
<property name = "target" ref = "accountService"/>
<!--注入事务管理器-->
<property name = "transactionManager" ref = "transactionManager"/>
<!--注入事务属性-->
<property name = "transactionAttributes"/>
<props>
<!--
prop 的格式:
* PROPAGATION:事务的传播行为;
* ISOLATION :事务的隔离级别;
* readOnly :只读;
*-Exception :发生哪些异常回滚事务;
*+EXception :发生哪些异常事务部回滚
key 值为方法名
-->
<prop key = "transfer">PROPAGATION_REQUIRED</prop>
</props>
</bean>
(2) 基于注解的配置
@Transactional() 属性:
-
PROPAGATION:事务的传播行为;
-
ISOLATION :事务的隔离级别;
-
readOnly :只读;
-
rollbackFor:发生哪些异常回滚;
-
noRollbackFor:发生哪些异常不回滚;