您现在的位置是:首页 >其他 >spring(事务管理)网站首页其他
spring(事务管理)
简介spring(事务管理)
事物可以看做是由对数据库若干操作组成的一个单元
事务的作用就是为了保证用户的每一个操作都是可靠的,事务中的每一步操作都 必须成功执行,只要有发生异常就回退到事务开始未进行操作的状态,这些操作 要么都完成,要么都取消,从而保证数据满足一致性的要求
Spring 中的事务管理
(1)编程式事务
在 项 目 中 很 少 使 用 , 这 种 方 式 需 要 注 入 一 个 事 务 管 理 对 象TransactionTemplate ,然后在我们代码中需要提交事务或回滚事务时自己写代 码实现.
(2)声明式事务
声明式事务
管理建立在 AOP 基础上,本质是对方法前后进行拦截,所以声明式
事务是方法级别的。
Spring 声明式事物管理方式有两种:
基于 xml 配置
基于注解实现
基于注解实现:
配置事物管理器
<!-- 配置 spring 事务管理类, 并注入数据源 -->
<
bean
id
="transactionManager"
class
="org.springframework.jdbc.datasource.DataSourceTransactionManager"
>
<
property
name
="dataSource"
ref
="dataSource"
></
property
>
</
bean
>
注解方式
<!-- 开启注解事务管理 -->
<
tx
:annotation-driven
transaction-manager
="transactionManager"
/>
在 service 中控制事务
@Service(value="userservice")
@Transactional
@Transactional
事务管理标签在service的方法中进行控制,在dao层加容易出事,比如转账功能
运行结果
500元直接没了,所以建议在service层进行事务管理控制,如
两个操作中有报错,对转账结果没影响
声明式事务不生效的场景
@Transactional 应用在非 public 修饰的方法上
异常被 catch 捕获导致失效
出现编译期异常
@Transactional 事务传播行为设置错误
数据库引擎不支持事务
同一个类中,使用非代理对象调用一个有事务的方法,导致事务错误
Spring 事务传播行为
什么叫事务传播行为?
即然是传播,那么至少有两个东西,才可以发生传播。单体不存在传播这个行为。
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事
务方法调用时,这个事务方法应该如何进行。事务传播行为是 Spring 框架独有 的事务增强特性,他不属于的事务实际提供方数据库行为.
例如:methodA 事务方法调用 methodB 事务方法时,methodB 是继续在调 用者 methodA 的事务中运行呢,还是为自己开启一个新事务运行,这就是由 methodB 的事务传播行为决定的。
Spring 定义了七种传播行为:
1. PROPAGATION_REQUIRED
指定的方法必须在事务内执行,若当前存在事务,加入到当前事务中,若当前没
有事务,则创建一个新事务,这种传播行为是最常见的,也是 spring 默认的传播行
为.
2. PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
事务传播行为类型
说明
PROPAGATION_REQUIRED
如果当前没有事务,就新建一个事务,如果已经存在一个事务中,
加入到这个事务中。这是最常见的选择。
PROPAGATION_SUPPORTS
支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY
使用当前的事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER
以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED
如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,
则执行与 PROPAGATION_REQUIRED 类似的操作。
3. PROPAGATION_REQUIRES_NEW
总是新建一个事务,如果当前存在事务,把当前事务挂起,直到新建的事务结束
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。