在我的博客阅读本文会有更好的阅读体验哦!博客: www.lxiaocode.com
更多内容可以到我博客浏览: www.lxiaocode.com
B站算法动画: https://space.bilibili.com/22392939
事务处理(1)
事务处理保证了系统中所有的数据都是符合期望、互相关联的数据之间不会产生矛盾,即数据状态的 {% span red, 一致性(Consistency) %} 。
达成一致性需要三个方面共同努力来保障:
-
{% span red, 原子性(Atomic) %}:在同一项业务处理过程中,事务保证了多个对数据的修改,要么同时成功,要么同时被撤销。
-
{% span red, 隔离性(Isolation) %}:在不同的业务处理过程中,事务保证了各自业务正在读、写的数据互相独立,不会彼此影响。
-
{% span red, 持久性(Durability) %}:事务应当保证所有成功被提交的数据修改都能够正确地被持久化,不丢失数据。
以上四种属性就是事务的 {% span yellow, “ACID”。A、I、D 是手段,C 是目的。 %}
事务的概念起源于数据库,但如今不再局限于数据库本身,所有需要保证数据一致性的应用场景都有可能用到事务。
1. 本地事务
“本地事务(局部事务)” 与 “全局事务” 相对应。本地事务是指仅操作单一事务资源的、不需要全局事务管理器进行协调的事务。
本地事务是最基础的一种事务解决方案,只适用于{% span blue, 单个服务使用单个数据源 %}的场景。本地事务直接依赖于数据源本身提供的事务能力,在代码层面,最多只能对事务接口做一层标准化的包装,并不能深入参与事务的运作过程当中。因此,不得不越过代码层次,去了解数据库本身的事务实现原理。
1.1 实现原子性和持久性
{% span green, 原子性保证了事务的多个操作要么都生效要么都不生效;持久性保证了一旦事务生效,就不会再因为其他原因导致撤销或丢失。 %}
1.1.1 崩溃恢复
当数据存储在内存时,一旦遇到 “崩溃” 等情况就会丢失。数据只有成功被写入磁盘等持久化存储器才能拥有持久性,而实现原子性和持久性面临最大的困难就是 “写入磁盘”。因为,写入磁盘这个操作并不是原子性的,不仅有 “写入” 与 “未写入” 状态,还存在着 “正在写” 的中间状态。
由于写入中间状态与崩溃都是无法避免的,为了保证原子性和持久性,就只能在崩溃后采取恢复的补