TDSQL是一个稳固运行了十年之久的分布式数据库,不仅撑持了腾讯公司的计费业务,而且还在微众银行等金融单位的外围业务零碎稳固、高效地运行了多年。这几年,TDSQL在技术层面不断进步,研发了很多新个性,诸如多级分区、热点更新、隐含主键、分布式事务等,不仅无力的撑持了事务型的数据库利用,而且在体系结构上也朝Spanner架构上迈进,是一个货真价实的NewSQL零碎。
MySQL/TDSQL的事务处理技术,次要包含四个方面的内容。其中,外围重点是并发控制技术。
第一,数据异常现象,这里不仅介绍有大家熟知的、SQL标准规定的三种读数据异样,还有其余的八种异样,会极大扩大大家对数据异样的意识。
第二,MySQL的事务处理技术,包含ACID的各个内容。
第三,MySQL的并发访问控制技术。并发控制技术是数据库事务处理的核心技术。能够说,没有事务处理,数据库就不能算是数据库;没有并发控制技术,事务处理也只是一个名词而已。毫不夸大地说,并发控制技术是核心技术的外围。
第四,基于对MySQL的意识,能够了解支流的数据如Oracle、Informix
数据异样
首先,咱们谈第一个问题:数据异常现象有哪些?
这列出了大家都相熟的三种读数据异样,别离是脏读、不可反复读、幻读。咱们看其中一个,比如说脏读。第一步,T2事务批改了数据行row;第二步,T1事务对同一个数据行row读取;第三步,T2事务回滚。这对于事务T1而言,读到的数据是将被回滚的数据,这就是脏读。
有敌人会问,脏读,也没有什么大不了的。试想一下,一个骗子T2转帐1000元给事务T1,事务T1查看本人的账户,入账了1000元,而后事务T1把一件衣服卖给了骗子T2,之后骗子T2拿到衣服后回滚了转账1000元的操作,而后抱头鼠窜了。事务T1既没有拿到钱还失落了衣服,损失很大。所以要防止这样的异样产生。
这三个读异常现象,是大家熟知的,也是SQL规范所定义的数据异常现象。那么,除了读异样,还有其余的数据异样吗?
比如说脏写。第一步,事务T1批改数据行row;第二步,事务T2也批改数据行row并提交,数据批改失效。事务T2认为本人的操作是胜利的。但可怜的事件产生了,第三步,事务T1回滚了,用旧值替换了被事务T2写过的值。这意味着事务T2存入银行的钱,失落了,因为帐本上只记着第一步事务T1读取的数据值。这就是写数据产生的数据不统一的景象。
那么,除了这些读和写异样,还有其余的数据异样吗?
接下来,咱们持续介绍两种写偏序异样:两个事务写偏序和三个事务写偏序。
咱们来看一下两个事务写偏序。首先,这里有个前提:医院向社会承诺,至多有一名医生对外提供电话咨询服务。然而,如果有多于两个医生在提供电话征询,则须要某个正在进行电话咨询服务的医生进行服务。
可是,大家看这两个事务。事务T1发现,有两个以上的医生正在提供电话征询,就请Alice进行电话服务;事务T2也发现有两个以上的医生正在提供电话征询,就请Bob进行了电话服务。这样,如果执行前只有Alice和Bob正在提供电话服务,这两个事务执行结束后,没有一个医生在对外提供电话咨询服务了。这就违反了“至多有一名医生对外提供电话咨询服务”的束缚前提。这样的景象,也是一种数据异常现象。
到当初为止,咱们介绍了七种数据异常现象了。
这里,还例举了四种数据异样,大家如果感兴趣,能够翻阅《数据库事务处理的艺术》一书。
咱们一共提及了11种数据异常现象,有读操作造成的三种读异样,也有写操作造成的两种写异样,还有写操作波及的两种写偏序异样等等。
对于数据库系统而言,如果容许下面所说的数据不统一异样产生,咱们这个依附数据库做交易的世界就会产生微小凌乱,数据库在,账面乱了。人活着,钱没了。
那么,数据异常现象,是怎么产生的呢?
方才谈到的三种读异样,有个一个共同点,就是存在并发的事务,这是第一个起因。方才所谈的四种读写组合,就是并发造成的。
第二,并发的事务,操作的是同一个数据对象。
第三,并发的事务对同一个数据对象,进行的总是读写或写读或写写这三种,没有读读。这就是上一个页面里用黄色标识的存在数据异样的三种状况。
第四,还有一种非凡状况,对于幻读而言,受谓词条件的影响,这时不是操作物理上的同一个曾经存在的对象,而是操作谓词限定的同一个范畴内的逻辑意义上的对象。咱们把第四种状况概括为“谓词的语义”。
这些合起来,造成了三种读数据异样。
接下来,咱们来剖析一下写偏序异样。
第一,存在并发的事务。
第二,并发的事务,操作的不是同一个数据对象。这点和方才的读异样不同。
第三,并发的事务对不同的数据对象,进行的总是读写或写读或写写这三种,没有读读并发。
第四, 操作后果,违反了“语义前提”。
请看第四点,操作数据时,须要恪守一个语义前提,即“至多有一名医生对外提供电话咨询服务”,然而并发操作突破了这个语义前提,呈现了没有医生提供征询的异常现象。
在数据库里,数据操作会被形象为两种,就是读操作和写操作。
读写操作组合在一起,有四种状况,就是这幅图外面的,读读、读写、写读和写写。
在数据库外面,只有读读操作,不会引发数据异样,而其余三种,都会引发数据异样。这样的总结,算是一个数据异样产生的起因,然而还不是很精确。
接下来,咱们谈第二个话题:MySQL的事务处理技术。次要包含事务锁和零碎锁,以及事务的ACID四大个性。
MySQL/TDSQL数据库事务处理技术概述
零碎锁是事务锁实现的物理根底,事务锁在零碎锁的根底上,减少了事务相干的语义。
在事务锁中,又要分为两局部,一个是元数据锁,如DDL操作施加的事务锁。另外一个是咱们在谈及数据库时,经常提及的锁,其实是用户数据上的事务锁。前者尽管在数据库引擎中存在,但经常被人疏忽,因为少数用户关怀的是用户数据局部。
这幅图用蓝线分为两局部,下面是元数据锁,上面是用户数据锁,他们都是事务锁。这幅图中画出了MySQL的重要的外部数据结构和他们之间的关系,大家能够按图索骥,据此深刻理解MySQL内核实现事务锁的相干技术。
在事务锁中,所有技术的外围机密,都在这张表外面。
例如,后面咱们谈到脏读,咱们看在MySQL中是怎么防止的。
Granted Mode,示意第一个事务中曾经授予的锁,而Requested Mode示意并发的第二个事务,第二个事务申请授予新的锁如表所示。对于脏读,第一个事务曾经授予X锁即写锁,此时第二个事务申请S锁即读锁,其对应的单元中是空的示意不能授予,这样第二个事务就被通畅不能继续执行,于是就防止了脏读景象。
大家能够对应这张表,兴许会思考不可反复读的数据异样是怎么防止的?此时,很有可能会感觉上面这张表是谬误的。
然而,MySQL因为又应用了MVCC技术实现了RR即可反复读隔离级别,所以RR的解决形式又有所不同,但这不是表明上面这张表是谬误的。这一点,前面会再提及。
数据库的事务处理技术,实现ACID四大个性,通常应用的技术,用上面这幅脑图能够很好的概括。
其中,一致性是目标,原子性和持久性是伎俩,而隔离性是在数据正确或局部正确的根底上为进步数据库性能而提出的个性。
MySQL的并发访问控制技术
接下来,咱们谈第三个话题:MySQL的并发访问控制技术。并发访问控制技术是数据核心技术的外围,也是数据库中最难的技术。次要包含事务模型、ACID四大个性之间的关系、C和I个性的实现技术。
数据库的事务管理器,实质上就是一个无限状态自动机,MySQL的事务处理模块也不另外,事务在各个状态之间进行流转和切换。
总结MySQL的事务处理技术,次要包含如下几个方面。
SS2PL和MVCC都是并发访问控制技术。对于并发访问控制技术,能够根据下图了解,在数据库引擎外部,须要先在保障正确性的根底上,再来提供高的性能。
后面,介绍过通过封闭并发访问控制技术怎么防止脏读,当初,再剖析一下MySQL、InnoDB是怎么解决幻象数据异样的。示例如图:
MySQL对于其余隔离级别的实现,也就是怎么防止其余数据异常现象,能够参考如下图和图中所附的链接,详情在链接中供深刻浏览参考。
p 序列化隔离级别:http://blog.163.com/li_hx/blo...
p 可反复读:http://blog.163.com/li_hx/blo...
p 读已提交:http://blog.163.com/li_hx/blo...
p 读未提交:http://blog.163.com/li_hx/blo...
支流数据库事务处理技术
接下来咱们谈第四个话题:支流数据库的事务处理技术。
能够看这张比照表格,概括了Informix、Oracle、PostgreSQL和MySQL这四个数据库的并发控制技术。
支流的数据库,简直都应用了封闭技术和MVCC技术。只有Infomix单纯地应用了封闭技术。
Oracle只管语法上提供了序列化隔离级别的设置,但没有提供真正的序列化隔离级别。这是因为Oracle常常会清理掉商在沉闷的事务所须要的旧数据(以多版本模式存在的旧数据)。
反倒是开源的两个数据库系统,PostgreSQL和MySQL实现了序列化。只是MySQL是在读数据时加锁联合SS2PL技术实现了序列化,这种形式的并发度很低,性能不好。而PostgreSQL则应用SSI技术实现了序列化,性能绝对较好。
在第一个问题中咱们提出了两种写偏序的数据异样,PostgreSQL应用SSI技术,解决了写偏序异样。
如果从正确性和性能这两个角度来掂量数据库的并发控制技术,显然,PostgreSQL在实践上优于MySQL,PostgreSQL采纳的SSI技术简单但高效。
这幅图具体比照PostgreSQL和MySQL的并发控制技术。
咱们从零碎锁、事务锁、事务锁的元数据锁和记录元组锁的角度进行比照,而后再从隔离级别的角度来看这两个数据库的并发控制技术。
首先,PostgreSQL和MySQL都提供了零碎锁,也都尽量利用了底层的硬件指令如TAS指令实现最根本的spinlock。应用操作系统提供的mutex来管制共享资源的并发操作。
其次,在事务锁方面,PostgreSQL对立治理元数据和用户数据,而MySQL则显著把元数据和用户数据离开用元数据锁和记录锁进行治理,并各自进行了死锁检测。
PostgreSQL对于元组上的并发操作,加元组锁到元组上,把事务ID记录在元组头上,用快照技术判断元组的可见性,操作完结则开释锁。而MySQL则是用内存锁表记录元组锁,等到事务完结后才开释。从这点上看,SS2PL技术的实现,在PostgreSQL和MySQL中是不同的。
从隔离级别的角度看,PostgreSQL和MySQL都采纳了MVCC技术来实现可反复读和读已提交。
PostgreSQL和MySQL在并发控制技术方面最大的差异,在于对确保数据一致性的序列化的实现上,采取的技术不同,实践上性能不同。这就是两者在并发控制技术方面的最大不同之处。
TEG计费平台部研发的TDSQL,是基于MySQL的分布式数据库,但TDSQL的做了大量的研发工作,TDSQL的技术始终在提高,分布式事务作为数据库里最难的问题,正在被TDSQL逐渐攻克。过来的一年多,TDSQL实现了分布式事务的写数据强统一,其原理如下:
在一个全局的事务调度器上,对于多个SET即跨SET的分布式事务,TDSQL实现了SS2PL技术确保了数据的强一致性,实现2PC技术保障了分布式环境下事务的提交的原子性和一致性,把2PC嵌入到SS2PL整体架构中,实现了分布式数据库事务模型。Spanner等支流分布式数据库在分布式事务处理机制上与TDSQL类似。