课程名称:2.3.5 How to Use Transactions in TiDB(如何在 TiDB 中使用事务)
学习时长:
30min
课程内容:
事务的基本介绍
- 一系列可以被当做一个sql语句的集合
- ACID特性
- 事务可以让数据更安全
- 事务可以保证并发下更安全
- 事务提供一致性
TiDB事务设计与实现
- TiDB分布式事务设计
- 使用两阶段提交来保证分布式事务的提交
- google percolator
- TiDB事务引擎是严格遵循两阶段分锁和多版本控制一个分布式事务模型
- 乐观事务模式
- 在语句执行过程当中,当client开启事务之后,这些写入将会缓存在TiDB的内存当中,直到用户发起提交指令之后,TiDB server通过prewrite和commit两阶段的方式对于所有涉及到的key和value写入TiKV执行两阶段提交
- 乐观事务模式有一下重要特性
- 快照级别的事务隔离级别,每个事务看到的都是一个全局的事务快照
- 所有修改都将缓存在TIDB的内存当中
- 只有在提交时才做冲突检测
- 提交操作有可能因为冲突产生回滚,需要用户进行事务提交的重试操作
- 从3.0开始引入悲观事务模式
- 在语句执行过程中,加了一个悲观锁加锁阶段,下图红框就是语句所涉及的key进行悲观锁加锁的操作,通过加锁实现了行锁机制和当前读机制,在悲观事务语句执行过程当中,由于提前加锁,在最终两阶段提交的过程当中出现事务冲突的概率将大大减小,在悲观事务模型的基础上新增了读提交事务隔离级别
- 在语句执行过程中,加了一个悲观锁加锁阶段,下图红框就是语句所涉及的key进行悲观锁加锁的操作,通过加锁实现了行锁机制和当前读机制,在悲观事务语句执行过程当中,由于提前加锁,在最终两阶段提交的过程当中出现事务冲突的概率将大大减小,在悲观事务模型的基础上新增了读提交事务隔离级别
如何使用TIDB事务
- 需要了解应用需求
- 乐观模式
- begin语句将隐式提交上一个语句并开启一个新的事务
- DDL语句也会隐式的提交上一个语句
- 提交阶段才会报错
- 悲观事务模式
- 3.0.8后默认开启悲观事务模式
- 3.0.8后默认开启悲观事务模式
- 被锁住,A提交后B才能提交
- 提供死锁检测
- TiDB悲观模型不支持GAP lock,只有行锁
- TiDB只会对读到的数据加锁
- 需要了解和mysql的事务不同点可以阅读下面两篇文章