Vitess告诉你两阶段提交到底长啥样

Posted 京东技术

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Vitess告诉你两阶段提交到底长啥样相关的知识,希望对你有一定的参考价值。

来这里找志同道合的小伙伴!


>>>>  背景


Vitess之前,先复习一下事务的四个基本特性:


   原子性:一个事务对状态的改变是原子的,要么都发生,要么都不发生,这些改变包括数据库的改变、消息以及对转换器的操作。

  一致性:一个事务是对状态的一个正确改变。作为一组操作没有违反任何与状态相关的完整性约束。这要求事务是一个正确的程序。

  隔离性:尽管事务是并发执行的,但看起来是单个执行的,即对于一个事务T,任何其他事务要么在T之前执行,要么在T之后执行,但不会既在T之前执行,又在T之后执行。

   永久性:一旦一个事务成功完成(提交),它对状态的改变不会受其他失败的影响。


举一个银行取钱事务的例子。如果同时完成了取出钱和账户的更改,那就是原子的。如果账户减少的钱等于取出的钱,那么就是一致的。如果这个过程不受其他程序并发读写你账户的程序的影响(比如你的女朋友们正在并发的刷你的银行卡),那么它是隔离的。一旦事务完成了,(无论完成之后机器宕机、断电、还是网络异常)账户的余额必然会反映取款后的情况,那么它是永久性的。


事务是数据库的核心特性,mysql、ORACLE、PostgreSQL这些数据库都是支持事务的。国内互联网公司更多的使用MySQL。


但是互联网公司的数据一般比较大,单机数据库服务难以承担这么大的数据量。这时候一般会做分库,将原来一个数据库的数据拆分到多个库(这里简单认为一个MySQL实例上只有一个库),比用户表做拆分,根据用户id,id对64取余数,然后根据得到的余数定位特定的分库。比如id等于1的用户的信息就在第1个库,id等于2的用户数据就在第2库,这样就解决了单机数据容量问题。


现在用户1要下单了,需要白条扣款生成订单两个步骤。两个步骤需要保证原子性的,要么扣款完成、订单生成,要么不扣款、不下单(all-or-nothing)。如果订单和白条表都是按照用户id做拆分的那最好,所有操作都会在同一个库上面进行,使用单机事务,MySQL就保证了原子性。如果白条表是按照订单id拆分的,那很可能不在第1分库了

以上是关于Vitess告诉你两阶段提交到底长啥样的主要内容,如果未能解决你的问题,请参考以下文章

基站天线天天见,它到底长啥样?

Linux 内核到底长啥样

5G基站到底长啥样?和4G有啥区别?

漫画:Linux 内核到底长啥样?

全新 Chromium 版 Microsoft Edge 浏览器到底长啥样?

大厂面试官眼中的好简历到底长啥样