wangwei
(王维)
1
课程名称: 如何在 TiDB 中使用事务
学习时长:30
课程收获:TiDB 分布式事务实现原理,以及使用方法。
课程内容:
事务概览
什么是事务?
- 一系列被当做一个原子单元的操作(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”
- 新 session 的显示事务(非 autocommit)开启悲观事务模式
-
autocommit 事务优先使用 乐观事务 模式,如果写冲突,重试时才使用悲观事务
-
单事务 开启悲观模式:begin pessimistic
- 配置系统变量:set tx_isolation = “read-committed”
- 部分锁行为与 MySQL 不兼容
- TiDB 不支持 Gap Lock
- TiDB 只支持 行级锁
悲观事务模型示例一
- 事务会被另一个并发事务卡住
- affected rows 是真实的数据变更行数
- 兼容 MySQL 语法
悲观事务模型示例二
- 并发会话死锁会被检测到
- 死锁,加锁等大部分报错信息,错误码与 MySQL 保持一致
学习过程中参考的其他资料