【TiDB 4.0 PCTA 学习笔记】- 2.3.5 How to Use Transactions in TiDB(如何在 TiDB 中使用事务)@2班_王维

课程名称: 如何在 TiDB 中使用事务

学习时长:30

课程收获:TiDB 分布式事务实现原理,以及使用方法。

课程内容:

事务概览

什么是事务?

  • 一系列被当做一个原子单元的操作(Oracle/SQL Server)
  • 数据操作的 ACID 机制
  • 是保证业务系统稳定性的基础

为什么需要事务?

  • 事务让数据变得更安全
    • 客户端只要收到后端的反馈,就以为这数据被持久化保存
  • 让并发操作更加安全,保证数据的正确性
    • 读写冲突
    • 写写冲突
    • 管理冲突(脏读,脏写,幻读等)

image-20201220155212487

  • 使应用程序更容易开发
  • 保持数据状态总是一致的
  • 保持各种约束
  • 每个工作流是互相隔离的

TiDB 的事务模型

  • 分布式事务模型
    • 启发于 Google percolator 论文
    • 采用 SS2PL + MVCC 的并发控制策略
    • 两阶段提交

image-20201220161248023

  • 乐观事务模式
    • 采用 Snapshot Isolation 级别(SI)
    • TiDB 采用事务调度器 scheduler
    • 数据修改,都缓存在 TiDB 内存中
    • 提交的时候才进行冲突检测(写-写冲突)

image-20201220161547817

  • 悲观事务模式
    • 支持当前读
    • DML 操作会提前加锁
    • 减少写-写冲突
    • 支持 Read-committed 事务隔离级别(RC)

image-20201220162112049

TiDB 中事务特性的使用

评估是否满足业务需求

  • 使用什么事务隔离级别:SI 或 RC
  • 是否需要锁机制
    • 配置所等待超时时间
    • 锁等待策略
  • 是否需要 Repeatable-Read 隔离级别(RR)
  • 是否并发执行 DDL 语句

乐观事务模型

  • 开启事务:begin,start transaction
  • 提交事务:commti,rollback
  • 配置参数 autocommit = 1 开启事务自动提交
  • begin 语句会进行隐式提交,并启动一个新事务
  • DDL 语句会隐式提交事务

乐观事务模型示例

  • 客户端 A 需要重新执行整个事务
  • 事务 A 的更新操作缓存在内存中
  • 一个语句的 Affected row 不是真正的影响行数
  • 事务提交的时候才检测 Update 冲突

image-20201220163552086

悲观事务模型

  • 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 语法

image-20201220164301288

悲观事务模型示例二

  • 并发会话死锁会被检测到
  • 死锁,加锁等大部分报错信息,错误码与 MySQL 保持一致

image-20201220164524763

学习过程中参考的其他资料