spring源码之事务上篇
Posted lucas2
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring源码之事务上篇相关的知识,希望对你有一定的参考价值。
前言
本篇之前,已经写过关于AOP的源码分析,在此基础上来阅读事务的源码是比较清晰的。另外,需要对数据库有一定的了解,我们所说是事务一般指的都是狭义的事务,即数据库事务。文中没有特别指出的数据库,均指的是mysql,后面再来写一篇关于mysql的锁和事务的文章。
概述
事务指的是一个程序执行单元,这个执行单元要么成功,要么失败,绝对不允许存在中间状态,它是我们恢复和并发控制的基本单位。
学习事务时,一般会拿转钱来做说明,这里也拿张三向李四转100元来说明,这个过程分为两步,张三帐户减100,李四帐户加100.
事务的四个特性(ACID)
- 原子性:事务由一系列操作来完成,要么保证这一系列操作同时起作用,要到全部不起作用。以例子来说,张三减100,李四加100。要同时成功或失败,不然就不满足原子性。
- 一致性:从一个数据库状态转变到别一个状态。一致性和原子性,经常会让人认为是一个东西,个人理解一致性是从状态变化的角度来看问题,即结果,而原子性更偏向于过程来看问题。以例子来说,这里的状态就是转帐前后,张三和李四总的资金数没有发生变化。可以说原子性保证了一致性。
- 隔离性:并发执行的事务是相互隔离的。以例子来说,假设张三帐户有1000元,他同时向王五也转帐100,转给李四时,他的户头上扣了100,就只有900了,转给王五是,再扣100,只有800了,如果李四收钱时出了问题,而王五收钱成功,这时把800写入到数据库。张三就会很生气,因为帐户被多扣了100。这个就是有问题的。
- 持久性:事务完成,不论发生什么,都不会对操作有影响。
知识点
学习spring事务时,我们一般会从事务特性、隔离级别、传播行为三个进行分析
- 事务的四个特性
学习事务时,一般会拿转钱来做说明,这里也拿张三向李四转100元来说明,这个过程分为两步,张三帐户减100,李四帐户加100.
事务的四个特性(ACID)
-
- 原子性:事务由一系列操作来完成,要么保证这一系列操作同时起作用,要到全部不起作用。以例子来说,张三减100,李四加100。要同时成功或失败,不然就不满足原子性。
- 一致性:从一个数据库状态转变到别一个状态。一致性和原子性,经常会让人认为是一个东西,个人理解一致性是从状态变化的角度来看问题,即结果,而原子性更偏向于过程来看问题。以例子来说,这里的状态就是转帐前后,张三和李四总的资金数没有发生变化。可以说原子性保证了一致性。
- 隔离性:并发执行的事务是相互隔离的。以例子来说,假设张三帐户有1000元,他同时向王五也转帐100,转给李四时,他的户头上扣了100,就只有900了,转给王五是,再扣100,只有800了,如果李四收钱时出了问题,而王五收钱成功,这时把800写入到数据库。张三就会很生气,因为帐户被多扣了100。这个就是有问题的。
- 持久性:事务完成,不论发生什么,都不会对操作有影响。
- mysql数据库的隔离级别
分为以下四个级别,每个级别都是来解决特点问题的
-
- READ UNCOMMITTED
总结
整个AOP的分析就到此结束,接下来对事务这块的源码做一些分析
参考链接
- https://wenku.baidu.com/view/6ce3121da300a6c30c229f89.html(核心关注点与横切关注点)
- https://www.cnblogs.com/syf/archive/2012/05/09/2491780.html(OOP与AOP)
- https://blog.csdn.net/garfielder007/article/details/78057107(连接点用地概念)
- https://docs.spring.io/spring/docs/4.3.18.RELEASE/spring-framework-reference(spring官方文档)
- http://www.cnblogs.com/xrq730/p/6753160.html((源码分析的参考文章)
- https://blog.csdn.net/elim168/article/details/78166296(@DeclareParents使用)
以上是关于spring源码之事务上篇的主要内容,如果未能解决你的问题,请参考以下文章
Spring源码剖析-事务源码之@Transactionl解析