TiDB 性能竞赛 11.16

Easter79
• 阅读 617

TiDB 实现了快照隔离级别的分布式事务,支持悲观锁、乐观锁,同时也解决了大事务的难点。

事务是数据库的基础,提供高效的、支持完整 ACID 的分布式事务更是分布式数据库的立足之本。事务是数据库执行的最小单元,允许用户将多个读写操作组合为一个逻辑单元。事务需要满足原子性、一致性、隔离性和持久性,也就是 ACID。

数据库有多种并发控制方法,乐观并发控制(OCC):在事务提交阶段检测冲突  悲观并发控制(PCC):在事务执行阶段检测冲突

乐观事务:

TiDB 基于 Google Percolator 实现了支持完整 ACID、基于快照隔离级别的分布式乐观事务。TiDB 乐观事务需要将事务的所有修改都保存在内存中,直到提交时才会写入 TiKV 并检测冲突。

Percolator 使用多版本并发控制来实现快照隔离级别,与可重复读的区别在于整个事务是在一个一致的快照上执行

TiDB 使用 PD 作为全局授时服务(TSO)来提供单调递增的版本号:

事务开始时获取 start timestamp,也是快照的版本号;事务提交时获取 commit timestamp,同时也是数据的版本号

事务只能读到在事务 start timestamp 之前最新已提交的数据

事务在提交时会根据 timestamp 来检测数据冲突

TiDB 使用两阶段提交来保证分布式事务的原子性,分为 Prewrite 和 Commit 两个阶段:

Prewrite:对事务修改的每个 Key 检测冲突并写入 lock 防止其他事务修改。对于每个事务,TiDB 会从涉及到改动的所有 Key 中选中一个作为当前事务的 Primary Key,事务提交或回滚都需要先修改 Primary Key,以它的提交与否作为整个事务执行结果的标识。

Commit:Prewrite 全部成功后,先同步提交 Primary Key,成功后事务提交成功,其他 Secondary Keys 会异步提交。

乐观事务模型在分布式系统中有着极大的性能优势,但为了让 TiDB 的使用方式更加贴近传统单机数据库,更好的适配用户场景,TiDB v3.0 及之后版本在乐观事务模型的基础上实现了悲观事务模型。

乐观事务模型在冲突严重的场景和重试代价大的场景无法满足用户需求,支持悲观事务可以 弥补这方面的缺陷,拓展 TiDB 的应用场景。

悲观事务在 Percolator 乐观事务基础上实现,在 Prewrite 之前增加了 Acquire Pessimistic Lock 阶段用于避免 Prewrite 时发生冲突:

每个 DML 都会加悲观锁,锁写到 TiKV 里,同样会通过 raft 同步。

悲观事务在加悲观锁时检查各种约束,如 Write Conflict、key 唯一性约束等。

悲观锁不包含数据,只有锁,只用于防止其他事务修改相同的 Key,不会阻塞读,但 Prewrite 后会阻塞读。

提交时同 Percolator,悲观锁的存在保证了 Prewrite 不会发生 Write Conflict,保证了提交一定成功。

TiDB 支持乐观事务和悲观事务,并且允许在同一个集群中混合使用事务模式。由于悲观事务和乐观事务的差异,用户可以根据使用场景灵活的选择适合自己的事务模式:

乐观事务:事务间没有冲突或允许事务因数据冲突而失败;追求极致的性能。

悲观事务:事务间有冲突且对事务提交成功率有要求;因为加锁操作的存在,性能会比乐观事务差。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
2年前
MySQL数据库InnoDB存储引擎Log漫游(1)
作者:宋利兵来源:MySQL代码研究(mysqlcode)0、导读本文介绍了InnoDB引擎如何利用UndoLog和RedoLog来保证事务的原子性、持久性原理,以及InnoDB引擎实现UndoLog和RedoLog的基本思路。00–UndoLogUndoLog是为了实现事务的原子性,
Wesley13 Wesley13
2年前
mysql 事物四大特性和事物的四个隔离
1、事物四大特性(ACID)1.原子性(atomicity):一个事务必须视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。2.一致性(consistency):数据库总数从一个一致性的状态转换到另一个一致性的状态。3.隔离性
Wesley13 Wesley13
2年前
mysql面试题总结
1.Mysql中的myisam与innodb的区别?2.InnoDB存储引擎的四大特性?3.什么是事务?4.数据库事务的四大特性?5.不考虑事务的隔离性,会发生几种问题?6.MySQL数据库提供的四种隔离级别?7.有多少种日志?8.事务是如何通过日志来实现的?9.数据库的乐观锁和悲观锁是什么?10.什
Wesley13 Wesley13
2年前
MySQL(三,事务)
数据库事务特点ACID原子性,一致性,隔离性,永久性ACID是Atomic(原子性)Consistency(一致性)Isolation(隔离性)Durability(持久性)数据库事务说是如何实现的?1.通过预写日志方式实现的,redo和undo机制是数据库实现事务的基础2.redo日志用来在断电/数据
Wesley13 Wesley13
2年前
(二)分布式数据库tidb
tidb既然是分布式数据库,所以它的事务应该可其它数据库事务有着不同的区别。我们来了解下tidb的数据库事务。(一)事物  1.几种数据库的默认隔离级别:tidb是乐观锁 !(https://img2018.cnblogs.com/blog/1766027/201909/1766027201909062133
Wesley13 Wesley13
2年前
MySQL transaction
MySQLtransaction(数据库的事务)数据库事务(DatabaseTransaction),是指作为单个逻辑工作单元执行的一系列操作。要么完全执行,要么完全地不执行。ACID事务必须具备ACID四个特性原子性(Atomicity)原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。一致性(Consistency)
Wesley13 Wesley13
2年前
Mysql系列第十五讲 事务详解
Mysql系列第十五讲什么是事务?事务的几个特性(ACID)Mysql中事务操作savepoint关键字只读事务事务中的一些问题事务的隔离级别关于隔离级别的选择什么是事务?数据库中的事务是指对数据库执行一批操作,这些操作最终要么
Wesley13 Wesley13
2年前
MySQL 事务的四大特性ACID介绍
事务的四大特性(ACID)1、原子性(Atomicity)事务是一个不可分割的单位,事务中的所有SQL等操作要么都发生,要么都不发生。2、一致性(Consistency)事务发生前和发生后,数据的完整性必须保持一致。3、隔离性(Isolation)当并发访问数据库时,一个正在执行的事务在执行完毕前,对应其他的会话是不可见的,多个并发事
Wesley13 Wesley13
2年前
MySQL常见问题
事务四大特性原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的;隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
Wesley13 Wesley13
2年前
Mysql事务,并发问题,锁机制
1、什么是事务事务是一条或多条数据库操作语句的组合,具备ACID,4个特点。原子性:要不全部成功,要不全部撤销隔离性:事务之间相互独立,互不干扰一致性:数据库正确地改变状态后,数据库的一致性约束没有被破坏持久性:事务的提交结果,将持久保存在数据库中2、事务并发会产生什么问题1)第一类丢失更新:在没有事务隔离的情况下,两个事务都同时
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k