课程名称:课程版本(101/201/301)+ 课程名称
学习时长:
课程收获:
课程内容:
事务概览
什么是事务?
- 一系列被当做一个原子单元的操作(Oracle/SQL Server)
- 数据操作的 ACID 机制
- 是保证业务系统稳定性的基础
为什么需要事务?
-
事务让数据变得更安全
- 客户端只要收到后端的反馈,就以为这数据被持久化保存
-
让并发操作更加安全,保证数据的正确性
- 读写冲突
- 写写冲突
- 管理冲突(脏读,脏写,幻读等)
-
使应用程序更容易开发
-
保持数据状态总是一致的
-
保持各种约束
-
每个工作流是互相隔离的
TiDB 的事务模型
-
分布式事务模型
- 启发于 Google percolator 论文
- 采用 SS2PL + MVCC 的并发控制策略
- 两阶段提交
-
乐观事务模式
- 采用 Snapshot Isolation 级别(SI)
- TiDB 采用事务调度器 scheduler
- 数据修改,都缓存在 TiDB 内存中
- 提交的时候才进行冲突检测(写-写冲突)
-
悲观事务模式
- 支持当前读
- DML 操作会提前加锁
- 减少写-写冲突
- 支持 Read-committed 事务隔离级别(RC)
TiDB 中事务特性的使用
评估是否满足业务需求
- 使用什么事务隔离级别:SI 或 RC
- 是否需要锁机制
- 配置所等待超时时间
- 锁等待策略
- 是否需要 Repeatable-Read 隔离级别(RR)
- 是否并发执行 DDL 语句
乐观事务模型
- 开启事务:begin,start transaction
- 提交事务:commti,rollback
- 配置参数 autocommit = 1 开启事务自动提交
- begin 语句会进行隐式提交上一个事务,并启动一个新事务
- DDL 语句会隐式提交上一个事务
乐观事务模型示例
- 客户端 A 需要重新执行整个事务
- 事务 A 的更新操作缓存在内存中
- 一个语句的 Affected row 不是真正的影响行数
- 事务提交的时候才检测 Update 冲突
悲观事务模型
- TiDB 3.0.8 版本开始,新建的数据库默认开启悲观事务模式
- 开启 全局 悲观事务模式:set global tidb_txn_mode = “pessimistic”
- 单事务 开启悲观模式:begin pessimistic
- 配置系统变量:set tx_isolation = “read-committed”
- 部分锁行为与 MySQL 不兼容
- TiDB 不支持 Gap Lock
- TiDB 只支持 行级锁