spring事务处理

本文深入解析Spring事务处理机制,探讨事务的基本概念、目的及其在保证数据一致性和事务隔离中的作用。详细介绍了Spring如何通过改造DataSource将操作绑定到同一连接,实现单一数据源的事务控制,并在多数据源环境下如何协调局部事务。同时,文章阐述了事务的ACID特性及隔离级别,以及Spring定义的传播行为,最后展示了Spring事务建模的核心组件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


title: 解析spring事务处理

解析spring事务处理

所有的技术,是因为有需求才会存在,事务也一样.假设你对事务一无所知,领导给你提需求,这个项目很好,却对事务没有支持,让你加个事务,你怎么办?首先你是对事务一无所知的,所以便提出了第一个问题

事务概况

什么是事务

一组要么都成功,要么都不做的操作构成了一个事务.

我们现实中,什么时候用呢?

很熟悉不过的例子:转账

什么需要事务处理了?

为了保证数据的一致性

什么是操作成功,什么是失败呢?

成功:操作完整的完成了

失败:操作过程中出现了异常,没有完成,抛出了异常

怎么控制一组操作要么都操作成功,要么都不做?

事务控制的重点:处理失败,如何让成功的操作撤销

如何撤销?

反操作,每个操作都提供一个反操作,失败时执行反操作进行撤销 ?? 不太合理

操作成功的最终体现是什么?

数据发生变化

反操作就是让改变还原,而数据一般是存储在数据库中,数据库本身是有事务控制的,可以提交,回滚,我们能不能利用数据库的事务来实现我们的应用事务控制?

应该是可以的

能不能让事务的所有操作使用同一个数据库连接呢?

单一数据源:能

多数据源:不能

单一数据源,如何让事务的所有操作使用同一连接?

连接是从dataSource中获得的,我们可以改造dataSource,把获得的连接放到线程上下文,下一个操作获取连接时,从线程上下文获取即可.

多数据源的情况下呢?还能利用数据库事务吗?

能,属于一个数据源的操作放在一个局部事务中(数据库事务),当全局事务(应用事务)失败时,让这些局部事务偶回滚,成功,则提交

事务4特性 ACID (面试容易问道)

(1)原子性(Atomicity)
事务定义,要么都做,要么都不做的本质要求

(2)一致性(Consistency)
事务的目的

(3)隔离性(Isolation)
希望并发事务之间彼此隔离,互不影响.到底隔离到什么程度就有隔离级别了.

(4)持久性(Durability)
事务提交,数据改变持久化

事务隔离级别:

(1)READ_UNCOMMITTED:读未提交

(2)READ_COMMITTED:读提交

(3)REPEATABLE_READ:可重复读

(4)SERIALIZABLE:序列化(串行)

探讨

应用事务和数据库事务是同一个吗?

数据库事务是数据库中控制多个数据库操作的

应用事务是应用中控制多个应用操作(方法)的

应用事务借用数据库事务,把它的操作结果还原,就好像操作没有做一样.

Spring中定义的传播行为:

(1)TransactionDefinition.PROPAGATION_REQUIRED:
如果当前存在事务,则加入该事务,如果当前没有事务,则创建一个新的事务.

(2)TransactionDefinition.PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起.

(3)TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行.

(4)TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起.

(5)TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常

(6)TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常;

(7)TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事物作为当前事务的嵌套事务来运行,如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED;

Spring事务建模

事务由哪些部分组成?

(1)构成事务的操作,或事务范围
(2)事务控制部分

事务处理这么复杂的一个事,spring是如何对他建模的?

(1)对事务本身建模

(2)对事务处理建模

Spring事务建模:三个核心

(1)TransactionDefinition:事务定义

(2)PlatformTransactionManager:事务管理器

(3)TransactionStatus:事务的状态表示

TransactionDefinition

定义传播行为

getTimeout():配置事物的超时时长的.比如,我给它设置的3秒钟,这个事物3秒钟内没用处理完,就失败.

isReadOnly():只读,为了提高事务处理的能力的,我们在只做查询的时候,往往都会设置为isReadOnly只读.

PlatformTransactionManager

getTransaction(@Nullable TransactionDefinition definition):状态

commit(TransactionStatus status):提交

rollback(TransactionStatus status):回滚

TransactionStatus

感受spring事务处理流程

1.是否把连接放到了线程上下文

2.是否是同一个连接

3.事务的传播

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值