SQL - 事务的基础知识
-
概述
- SQL 事务的基本特性
-
背景
- 划水力作
1. 事务
-
概述
- 事务
-
事务
-
定义
访问并可能更新数据库中各种数据项的一个程序执行单元
-
-
我的理解
- 操作集合
- 对数据库进行一些列有序的操作
- 这些操作被视为一个整体
- 这个整体必须是完整的
- 多个整体之间, 可能会相互影响
- 操作集合
-
怎么说
- 光说这个理解, 肯定是会很抽象的
- 下面, 我就简单介绍一些场景来举例子
- 光说这个理解, 肯定是会很抽象的
2. 事务的特性
-
概述
- 简述 事务的特性
-
acid - 酸的
-
a - atomicity - 原子性
- 事务的一系列操作, 是一个完全的整体
- 要么都成功, 要么都失败
- 没有第三种状态
- 针对 操作
- 事务的一系列操作, 是一个完全的整体
-
c - consistency - 一致性
- 事务前后的数据, 必须保持一致
- 事务处理前, 所有的相关数据, 是 版本A
- 事务处理后, 所有的相关数据, 是 版本B
- 不可能出现 一种状态, 介于 A 和 B 之间
- 针对 数据
- 事务前后的数据, 必须保持一致
-
i - isolation - 隔离性
- 并行/并发 处理多个事务时, 事务之间, 可能会发生影响
- 需要想办法避免这种互相影响
-
d - durability - 持久性
- 执行完的事务, 需要保存下结果
-
3. 场景
- 概述
- 一些相关的场景
- 举个例子方便自己理解
- 如果前面看明白的, 后面就不用看了
背景
- 某人的银行卡上, 有 100 块钱
- 每个场景都是以这个为 初始条件
场景1 - 取钱故障
-
概述
- 取钱故障的场景
-
流程 - 假设
- 用户 用户请求取钱, 100 元
- 银行 确认余额
- 银行 扣除余额
- 银行 给出钞票
- 用户 取钱完毕
-
意外
- step 4 出问题了
- 余额被扣除, 但是钞票没出来...
- 结果
- 用户白白损失了 100 块钱
- step 4 出问题了
-
问题
- 整个流程, 并没有走完, 就中断了
- 用户没有取到钱
-
相关特性 - 完整性
- 如果这个时候, 保证了流程的完整性, 就不会出现这个情况
- 钞票没给出来, 表示流程失败
- 失败了选择还原后重试, 而不是继续执行
- 如果这个时候, 保证了流程的完整性, 就不会出现这个情况
场景2 - 存钱故障
-
概述
- 存钱场景
-
流程 - 假设
- 用户 请求存钱 100 元
- 银行 接受钞票
- 银行 确认存入
- 用户 存款完毕
-
意外
- step3 出问题
- 金额 没有加上
- 结果
- 存款前后, 余额 都是 100 元
- step3 出问题
-
问题
- 流程走完了
- 但是 存款后 的数据出现了问题
- 结果
- 用户损失了 100 块钱
-
相关特性 - 一致性
- 需要确保 事务 执行完后, 数据就是完整的受到了事务的影响
场景3 - 并发取钱
-
概述
- 并发取钱
-
流程 - 假设
- 用户 在 银行窗口A 申请取 100 元
- 用户 同时, 在 银行窗口B 申请取 100 元
- 银行 确认金额
- 银行 扣除余额
- 银行 给出钞票
- 用户 取钱完毕
-
意外
- 窗口A 和 窗口B 同时取钱
- 每个窗口取了 100
- 结果
- 用户去除了 200
-
问题
- 银行亏了 100
-
相关特性 - 隔离性
- 需要避免事务之间的相互干扰
场景4 - 银行数据丢失
-
概述
- 数据丢失
-
流程 - 假设
- 银行数据丢失
- 账户金额全部归0
-
结果
- 用户损失了 100
-
相关特性 - 持久性
- 需要确保, 事务的结果被正确存储
ps
-
后续
- 讲一下 隔离性 遇到的一些问题
-
ref
尽量尝试解释清楚; 自己校对能力有限, 如果有错误欢迎指出