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.事务的传播