00:07
探索前沿研究,聚焦技术创新大家晚上好,欢迎参加今晚的DB洞见直播活动,我是来自腾讯的虚拟主持人小树。DB洞见系列是腾讯云数据库举办的数据库论文精选解读活动,我们每期将邀请学界或腾讯技术大咖解读数据库基础技术创新趋势,让更多数据库从业者了解行业前沿技术热点,分享数据库技术创新成果。本期我们邀请到腾讯云数据库的高级工程师陈玉星老师与大家开聊数据库事务一致性检测,此外,我们还设置了抽奖环节,欢迎大家认真听课,积极提问,我们将会为中奖同学送上QQ family多福公仔。下面的时间就由陈玉欣老师与大家。
01:07
进行分享。感谢小树,下面由我来给大家进行分享,大家晚上好。呃,先给大家做一个简单的自我介绍的是腾讯云数据库高级工程师陈立新啊,今天给大家分享的主题是数据库思路一致性检测,今天的主题是围绕一篇文章来讲解。我们今天的主角,包括这个。文档的这个背景介绍,这次咱们解决方案最后会做一个简单的总结。那我们就呃,直接进入主题,首先我们来看这个背景介绍,这个主要一致性其实会有很多部分的理解和解释,但是我们今天要以数据异常的角度来解释,呃,最简单的定义,呃,一致性其实就是说保证这个。
02:12
不存在数据异常。那什么又是数据异常?我们通常比较熟知的这个数据异常。脏脏鞋,丢失更新等等,有种类啊。我们来看这边一个比较经典,但不是那么简单的一个数据,叫做编去啊,就是说比如说有某,如果某个用户他有两个投资账号。呃,允许其中一个账号可以是暂时亏损,但是两个账号的这个总额它是不能为亏损,所以我们比如说一开始两个账号各有100美元的这个。余额,然后假如有两个事务同时开启,然后A事务查询总额,发现这个总共有200,然后并在第一个账户取出了200个,然后另一个一事啊也查询总有也发现有200到。
03:11
总价值,然后可以从第二个账户取出200万。然后可能两个两个事物都提交成功了,那结果呢,就是说各取出了200刀的一个钱,然后总共取出了400。那我们就请。那这个按正常的理解啊,它是不允许这个超额去取钱的。所以我们可以就是说直观的是认为它是一个数据异常。那这种啊操作呢,其实是在绝大部分的这个数据库默认配置都会发生。我们来可以看一下这个,呃,写篇序这个例子的标准测试样例是怎么样?它初始可以是两行数据。然后有两个事物分别在不一样的session开启,然后两个事物分别对这个对方的进行了这个改写,然后两个失误最后都提交成功了,那其实这个就是一个标准的一个写片区异常。
04:16
其实在很多这个数据库的这个默认配置,包括这个照级别都会出现用户通常这个需要这种额外的一些约束啊,才能去避免这一些异常。或者说呃,去大分数据后,他需要开启和创新企业才可以去避免这样的一个异常。那其实呃,这个一致性呢,也是有强弱之分的,数据库中其实满足这些强弱一致性啊,通过隔离级别来实现。在某些弱的级别下,其实一些异常的出现其实被视为是正常现象,因为有些异常在有些业务场景下。
05:01
是可以接受的。那为什么要允许一些异常的出现,不是说禁止所有的异常,然后去保证正常正确性,呃,这个是因为这个正确性跟性能之间,其实它是有权衡的,正确性越高,它的这个性能就越差,相反这个允许一些异常的出现,其实性能相对也会比较好。然后标准定义下,其实是有四种异常,或者说四种异常现象从P0到P3,然后隔离级别,它是逐步去禁止这些,像它是它是在所有的级别都是不允许的。然后P它是单在读未提交啊。允许出现在起来到最后这个泛读,他允许在这个可重复的级别下。它是会出现,有可能会出现的,然后这个在可创级别下,也就是我们最高级别下,它其实理论上是不允许呃出现任何异常的。
06:09
简单来说,这个隔离级别越强,允许的异常就会越少啊,通常来说隔离级别是逐级叠加,就是说这个弱隔离级别不允许的异常。这个同一个异常,他在更强的隔离级别下,肯定也是不允许。然后其实这个四种标准的异常只是一小部分异常,我们看到其实是有更多的这个数据异常的一个形式。呃,在四种标准的呃隔离级别之上,其实也是中或者中之间,它也会穿插更多的这个。危机。然后这个,呃,表格也是显示的,这个是这些新的异常是允许与不允许的一些关系,但有时候他也不是这么严格,可能就是说各种数据库厂商他会有不一样的理解,然后实现程度也不一样。
07:08
导致有一些异常没有按预期去出现或者禁止。然后这个其实我们这边看到好像很多异常,但其实他这只是很小一部分的一些异常,然后理论上存在的这些级别啊,也是可以是相当多的,大家都可以去定义一些不一样的级别,允许或者不允许不一样的异常。那其实这里就会有,对于一些新用户,或者说对于一个呃用户去使用一个新数据库来说,他其实有一些困扰,就是说他其实不太直观的知道,诶哪些异常在哪个级别应该出现,或者在哪个级别不应该出现。然后怎么去理解这些,呃,级别跟异常也是有呃。很多困惑的。那带着刚才的问题,我们可以来看一下我们到底是要研究什么样的一个问题。首先我们来看一下有一些非传统的隔离级别。
08:10
我们可以看到这些呃不一样的名字,那他这些级别跟传统的四个级别当中,我们比较熟悉的一些级别当中,他呃有没有有什么联系,或者说有什么强弱之分,比如说我们比较强制的是这个呃快照的级别,比如说他用这个级。比如说这个币里面,它有用到这个这个这个乐观的一个级别的,然后还有这个这些不一样的级别。其实看到这些级别,我们是呃,没有办法直接去判断啊,到底表现会怎么样,有时候呃,这个官方的文档他们也会描述比较,那这里就有个问题,就是说他们应该等价于哪些级别,或者说相对于四种隔离级别来说,它是应该更强于哪一种级别,或者更弱于哪一些级别,这些都是我们作为新用户,或者新尝试使用这个某一个数据库的那个用户来说,都会或多或少一些这个困扰。
09:21
对。所以啊,细化来说,从用户角度出发啊,那么第一就是说怎么针对啊自己的业务来选择一个隔离级别,怎么去理解这些啊新的隔离级别具体问题问题来说,就是说务上哪些异常是允许的,哪些异常又是不允许的。对,然后第二就是说数据库有时候声明的隔离级别,他可能达不到标准,或者说他本身就,呃不是一个那个理解,这上跟它时间上就不是一个简单的对比,比如说我们熟知的这个声明的这个串行级别,因为它消除了四种标准的异常,包括他消除了这个换部的种现象。
10:11
但其实是没有消除所有异常的,他们在啊这个这个行情节下,其实存在写根据异常。那这种生明现象其实在很多数据库都会出现,他们把这个消除四种标准的数据异常当做是消除所有异常,这个是表明了这个可靠性是。他们支持。那第三就是像刚才说的,大家对呃,隔离级别标准会不一样,其实不单是可串性级别,其他弱的隔离级别也是一样啊,也会有不一样的这个标准,以及不一样的实现方式,比如说我们看这个它的可重复级别,级别它是不存在换那它存在,呃写篇序其实是类等于这个呃快照为级别。
11:05
那是像SQL server。他在八八级别,它是呃不存在这个呃写PH,但是它是存在换,所以我们看这个呃不一样的数据库,它说说明的是同一个隔离级别,但是它的表现是完全不一样的,在某一些程度上。然后从厂商的角度出发,也是有很多需要解决的问题,比如说大家数据库版本都需要迭代,那一般这种回归测试压例啊,呃没那么完整,对只能从一定程度上去验证它,比如这个Co screen,这个2011年它9.1版本就是呃已经是实现了可创新化的这个快照跟级别SI,然后呃,但是因为它可能内部有一些呃优化的步骤,导致其在呃一些第三方失误插入之后马上更新干扰的情况下,会出现这个呃G的异常,就是说会存在这个写偏序的这个这个异常。
12:11
而这种异常正常是不允许的,也不期待的,在在这个可创性级别,然后直到这个七八年后,这个呃,2019年12.4版本才把这个bug修复。所以呃,他他们才把这个有一些那个回归测试样品加上去,然后可能就是说来慢慢去避免这些呃GI的一些些编去对。所以呃,第二个来说就是说可能也有一些呃厂商他是需要研发新型的这个数据,然后这些数据库的,很有可能是需要这个开发完之后,需要验证这些呃逻辑的正确性,包括去发现有没有一些设计的缺陷,有一些程序的导致一些程。
13:01
对这些他们都是需要有一个验证的过程,所以其实这个呃,一次性检测,它是不单是困扰这用户,也困扰着这个厂商。然后今天是给大家介绍一个,呃,事物执行检测的方案,叫Jack Ella Ella这个这个方案Jackson,其实这个是一个更加强大的一个方架,可以测这个分布式的啊,一致性偶线性一致性的这个亚的一致性级别。而A只是其中的一个事物验证的一个模块。然后他们也把A的方案发表在了这个DB2020的这个会议当中。所以整体来看,Ella是可以测试出各种。呃,级别下可能存在的异常,然后也可以去测出这些异常,也会让我们更好的去理解当前级别的一个表现。
14:03
然后通过这个理解当前级别的表现啊,或者说发现当前级别的这个异常的可能性,就可以验证这个,呃,当前级别是否达到了一个标准,理论上的一个标准。然后他们的测试也是具有一定的那个解释性,可以去救援,也可以去复现一些情况。在我们其实在我们讲解这个呃,这个这个方案之前,我们一直在强调一个呃问题。就是说啊,我们是如何定义这个数据异常的,如果说论文他们如何看待这个数据异常,怎么去认定这个数据异常,之前我们说的这个最简单的一致性是不存在啊,任何数据异常那。那如何判断这个数据异常发生?
15:02
我们比较常理解的就是说,可能需要去读为提交了的不要去读这个啊,没有提交的写,然后一个事物可能这个呃,读两次呃。的值,读到不一样的值,它可能算作是一个数据。这些描述其实一定程度上都可以算作是数据异常。但是这些表述其实没那么正式,而且其实没有办法去呃总结规律,所以我们其实需要呃更加规范的这个呃方式来定义这些呃数据异常。所以呃,在判断这些,呃,在判断有无数据异常之前,我们其实需要啊,把数据库执行后的这个数据抽象是抽象出来,抽象的表达出来,然后这个艾的这个方案里用的是这个idea的一个,呃。
16:05
表示模型,这也是一个比较通用的一个事物的一个表示的模型,通常就是会把这个呃,数据库的操作的对象。以及操作方式的操作方式,呃,一系列的那个。操作就读写这些操作抽象出来,比如说我们呃,有这个对象,通常它是这个,我们XYZ来表示,呃这个对象我们可以理解为它是不一样的,TK等于一,K等于二这样的一个。情况,然后是这个操作相操作操作或者更新操作,然后提交,然后回滚这些呃操作。那数据库执行完一些操作之后,呃,一组操作一组这个事故之后,我们其实把这一组操作可以记录下来,然后记录下来,然后抽象成这发模型,把它抽象出来,我们就把它叫做这个history,也可以说叫历史,或者说是调度。
17:17
调度其实也是就是说是历史的一个前缀,等于是说调度里面可能还有这个。没有完成的事。而历史history的话,它是。全部是完成了的一个事。那我们来看一下之前我们提到那个写编剧的执行的,呃。情况,它其实也可以表示成可表,就像我们这一呃。表示的这个标准,然后其中读写操作的下角标,它其实表示这个这个这个事物,然后这个呃。对,对象上的下边,它其实表示版本数。
18:00
所以写编剧的这个,呃,调度就是说修一他进行了读操作,然后他读取了这个,呃。X对象上的零版本的数据,然后数二读了这个对象Y上的版本的数据,然后数一又改了这个Y的这个数据,然后数二改了这个。X下面的一个。没出去。是这样的一个执行操作,所以就是说把这个数据库上执行的结果抽向我的一个。呃,可以表示数学上或者说更正式的一个表达方式。那有了这个表达方式之后,我们可以做什么呢?其实我们呃,就可以去通过这个调度去构建一个冲突图的一个呃。东西就是冲突图,它是可以以事为顶点,然后冲突为边的一个这个这个模型。
19:00
然后十五一点就是比较容易理解,那什么是冲突呢?冲突其实就是说它是呃呃。两个操作如果在一定时间内它作用在同一个对象上,而且某一个操作它是写操作的话,我们称之为这两个操作它是有冲突的。比如说我们常说的这个呃脏脏写,就是说呃一个事物写写的事,但是他他写了一个呃值,更新了一个值在某个T上,然后另一个失误在同一个T上也更新了那个值,两个失误都没有提交,那其实就是呃有了一个。脏血的情况,结节中毒。呃读的话就是说也是一个写读,呃读就是我我写了一个数据之后,更新了一个数据之后,我还没提交,但是别人又去读了这个呃数据。是这样的一个表示方式。
20:00
那比如说这个右边的这个,呃,写篇序的例子,我们发现这个事物一跟事物二,它都是作用在X变量上,然后呃也有一个斜边,也有一个斜那个操作,所以它就形成了一个。RW的一个周边。同理,在这个Y对象上,它也有一个呃的一个边,然后我们发现它是有有有有有这个箭头的,它这个箭头其实随着是随着他这个版本变化啊去决定的,就是说我先读了一个旧版本的,然后更新的一个老版更更更新的一个版本,那我们就有这样的一个时间顺序啊的一个一个版本,所以是从事物一到事物二有一个一来冲突一个版本,事物二到事物一也有一个从旧版本到新版本的一个。100。然后我们之前说他这个写片区是一个异常,然后我们也发现其实这个冲突图它是存在黄的。
21:06
对,所以其实我们通过这个模型,然后通过这个构建这个冲突环图啊,就可以把这个冲突还图啊,有冲突图有还这个事情就认为是一个,呃。有异常的一个状态,对,那为什么说这个有环纠通就是一个异常,因为我们认定这个串行执行的结果啊,是一个没有问题的一个数据状态,比如说你事物一先做,做完了之后我再去做室外的一个。操作一个一个做,那他就不会有这种依赖关系,是没有这个数据异常的出现。而冲突图有的情况,它其实就是说是一个不可行的一个执行结果,它的结果不等于任何一个串行执行的结果,所以我们认为它的执行状态或者结果是不可串行,所以就是一个呃异常简单来说就是说它是呃读写操作两不一样的事物,它是有交叉,然后它的执行中间状态或结果不等于诶串行这样去执行的一个结果。
22:21
对。那如果我们把啊,数据库执行的结果都转化成这种history意识,我们就可以用这个history去这个这个它的这个冲突图有环无环啊,去判断他有没有数据异常。因为这个,呃,我们也如果有了,我们也很容易去构建这个,呃,冲突,我们有事物,我们有这个依赖关系,容易确定我们有版本关系。但是呢,就是说这个,呃,现实数据库执行结果有时候是很难获取统计,获取到一些统计信息,就算获取到,有时候也很难直接转化为确定的这个或者说调度。
23:10
呃,这个很难,其实有两个层面上很难,第一个难是说他的依赖关系,有时候的那那个可能性是很多,很难决定他是到底是哪一个依赖于哪一个。第二个很难是说这个一发失误一大的不确定的依赖关系就更多了,然后需要分析和决定的,这个成本是很大,导致这个验证啊速度会相当的慢,或者说可能性相当多,内存和计算资源不足于或说短时间内很难去验证它的这个依赖关系,对。下面我们来看一下这个啊。读写之间依赖判断为什么有一些难度?一个第第一个情况,你们两个事物都在K1上更新的值,那我们直接获取了这个呃,事物的这个历史,呃,呃,这个这个这个执行情况,我们其实是没有办法判断哪个事物先去,呃。
24:14
更新了,然后另一个失误再更新,我们只知道诶这个更新了一个在K的上更新那个也是一样个道理,我但是我们没办法的执行后关系。然后如果两个事物都在K等于一,B等于,就更新了B等于五,然后其他事物读到了K等于一,B等于五,我们也不知道他是到底是谁改的,我的道。对,就是两个师傅可能做的一样的事,但我们也不知道他下一个读应该是谁。然后第三种情况就是说,呃。这个呃,事物读写之后是否参与重组依赖的判断,其实需要两个事物在时间上有交叉的,然后很多这个分布式呃的情况的话,它是时间是不可信的,不对的,两个节点的那个时间是有可能是不一样的,对。
25:08
然后之前也提到这个计算成本可能很大,因为传统的方式,如果考虑所有的这个啊。创新执行结果去匹配这个呃呃去去匹配最后的结果,其实本质上它是一个呃MP complete的一个这样的一个问题,是对需要去验证的话,它是一个非多项式时间的一个执行。那A呢,到底是如何得到这种呃可靠的这个history啊,其实是需要啊执行结果满足两个特性,第一个就是呃可呃追溯性,意思就是说需要知道这个版本之间的顺序决定这个呃。写写依赖谁先写,谁后写,需要确认,然后第二个就是说呃是可复原,意思是说呃需要知道读的是哪一个版本,谁的写。
26:07
然后这就可以决定这个写读依赖,然后其实从这个这个读写依赖,它是可以通过这个写写依赖,写读依赖去推导出来的。那Jason里面呢,AI这个方法里面呢,它其实是呃,它的输入设置其实很简单,其实就只有呃三种操作,第一个是读操作,就是我们比较熟悉的这种几的语句,然后第二个是这个。插入操作就是我们的游戏,然后只有一个是这个更新操作就是我。Update,然后这个update语句相对于普通的update,它其实是有一些不一样,而且关键点也是需要在这里做,然后他是需要把更新值,呃,跟原有的值一起附带上去,我们中间插一个这个间隔,然后就让它旧的值新的值都保留上去。
27:08
我们来看一个呃简单的例子,比如说我们第一个呃,第一行的这个操作评测,我们是插入了一个新值点1101,然后R1,它是读了表里到了一一点一,对这样一个情况。然后第二个W1呢,它是更新这个上的内容,我们是希望把这个更新为。所以注意这里其实我们不是简单的把它更新啊,我们是需要把原来的这个呃值也要附带上去,就是说需要把这个V跟,然后中间有个空格话,然后连接起来,然后直接更,然后我们在R再次读到这个啊一的值的时候,它值其实V1是不单单就等于二,它就变成一空格二这样的一个形式。
28:00
啊,以此类推,我们就是分析值为三的时候,我们也会读到123。所以我们很明显就可以看到这个呃,如果我们得到最后的一个呃,呃,读这个数据,我们可以知道这个写的版本啊是怎么样的一个顺序是先写了一,再写了二,再写三,然后我们读到了哪一个,这个呃版本也是可以直接通过这个predict这个前缀,它在到底在哪里,我们就可以知道它是有一个关系。我们来看他文中给出的呃一个例子也是类似的,就是说呃,我们看中间这个事物,它在K的一上,他读到2345啊,然后在上面它K等于255的时候,呃它是读到了23458,然后在下面这个失误,它是有一个就是我们的update操作,就是说在二五能255上,它也是写入了八,所以我们其实是有呃这个呃。
29:06
从这边它是有一个读写依赖的,因为这里是写了之后,它是有一个新的一个八,然后从这下面这个事物到上面这个事物呢,它是有一个呃解读依赖的,对,因为他读到了一个最新的一个发。然后其实这个呃,最上面的事物到最中间是我们其实还是有一个可以有一个时间上的依赖,它叫参这个这个这个依赖这个其实是用作这个呃严格一致性去判断的,就是说他可能呃不单是用到了传统的这种写读写依赖,还还有一定的这个时间上的要求顺序。要满足,然后整体上去做判断。那在AR检测模型中,基本上遵循了这个RD这个文章里面的定义的一个分类,比如说啊,他J0异常,它就是所有都是WW边的一个。
30:05
然后GG,它是这个W或者WR组还有G,那么这些异常还的组合其实很类似我们开头说的四种异常和四种种或者说四种异常现象。所以也有逐步不允许的这个限制,我而我们在验证隔离级别是否达到标准啊,其实就是从原来最简单的他们可以呃简单验证四个异常转化为四大类的环的检测。对,然后一样的那个情况,就是说可算性级别,我们其实不希望任何异常出现,其实就是说不希望任何环节出现,然后有一些隔离级别,它允许出现一些异常,它其实就是允许一些呃边组成的缓区。组成的环的异常去在一些弱的级别有可能出现,对,所以这里也是异常也是逐级分类,然后隔离级别也是逐级去允许一些某些编组什么。
31:12
下面我们再来探讨一下这个AR检测的一个正确性和完整性。AR检测是其实可以保证正确性,因为只要检测出异常,那这个异常一定是存在的,只要异常出现,理论上是可以复现。也能说明数据库在这个模型下是不一致的。然后A是不能保证完整性,AR检测之后不代表系统啊,完全满足一致性啊,其原因是因为有些异常,它不能用环表示,像脏脏,或者说一些中间都有些状,有些中间状态需要确认的一些异常。然后A也没有检测这个位,他们也没有这种范围查询的一些操作。
32:01
然后通过ANA初期啊写的特殊处理,所有的依赖关系都是确定性,通过事故执行结果来判断这个依赖关系的复杂度,基本上是线性。呃,我们可以看到这个随着并发增大这个本线的时间基本上都是平稳渐进增长,传统的做法需要这种啊,你对任意事物之间的顺序复杂度是成于这个事物个数,我们看到这种传统的方式做出个并发。增大的话,它的验证时间是指数增长,一下子就增大到了这个验证的一个短时间不可证的一个程度。呃,下面这个例子是,呃,用AR工具这个这个测这个cosy老版本上啊,测出的这个异常在可创性级别以下,它其实存在这个。
33:02
写篇序异常的,呃,我们可以看到这个,呃右边的可复现的一个一个例子,总共就有三个事物,然后这个写篇序的发生是在两个事物。呃,轻插入数据并决。加入没有得到新插入数据,然后最后形成了一个斜距。然后会出现这个异常,是因为有第三个事物的一个干扰,对某一个插入啊进行了这个分析,导致后面的这个呃读依赖没有作用在这个插入纸上,然后我们如果单纯去执行起呃事物一事务二的话,它是不会出现啊异常的情况,对他其实就是因为第三方的一个简单的一个干扰啊导致这个。啊,这这种啊,平是上的一个存在。然后我们也在我们的产品上进行了一个简单的测试,我们在T2.0这个版本上去测试,我们在可串行级别下是没有呃测出任何外界的。
34:10
呃,然后在可重复读的级别下,其实相测出是相当于这个快照级别,类似于这个的一个可串性级别。对,然后最后我们来回顾一下这个AR事物一致性检测框架,它主要解决的这个两个问题啊,一个就是说怎么确定这个版本之间的顺序,怎么去决定这个冲突依赖。啊。怎么把执行结果变成这个确定性的这个历史调度,主要是通过这个版本,我们把更新值。更新时把旧旧的保留下来,一起一起这个连接起来,然后去做更新。第二个就是说怎么从历史调度判断个这个数据异常,这个主要通过这个冲突的缓解一下。
35:06
做到。当然这个A也可以检测更多的一致性,包括这种严格一致性,通过叠加时间的要求,比如说T2,呃是在T1提交之后才开始的,呃,那么呃,串行的这个执行结果,它必须是这个T1到T2,它不允许是T2到T1。这样的一个职责。那么他也对时间上有一定的。谁前谁后是一种。要求比是要跟这个逻辑上,逻辑上跟这个物理上,物理时间上它要一致的,所达成一个最严格的一个执行。当然上面提到的啊,只是包包括标准的四种啊,隔离级别它只是一小部分的,呃,一致性级别其实可以细分更多的级别,更多的一致性的东西也其实可以去做更多的验证,就只要去啊。
36:12
做这个环的这种分类,这种哪种环哪种模型,它是它是允许哪一些边出现的一些环去做这样的一个定义,然后我们就可以去做检测。最后我们来,呃。看一下这个介绍,或者说一些可以改进的点啊。其实框架这整个版,这个框架本身其实不是那么简单,它其实需要呃调节很多参数才能达到一定的效果。呃,然后他这个原先这层框架来,它也是其实更多的是测试这个分布式的一些一致性,然后它这个事物上的这个测试,它只是一小坏的一个功能。
37:02
然后他很多参数,它控制不一样的这个情况,比如说他呃控制不一样的压测不一样的并发量,所以有时候啊,压测不够,那就不充分啊,就有一些异常,它是比较小概率就很难以发现,有时候也会。啊,没那么容易腹泻。然后它也是呃不支持,呃比例也不支持这个。为此范围这个查询,所以它是没有办法检测这个,也没有办法判别这个啊这个这个可重复,嗯可创新呃。级别之间的一个区别。然后他传统像我们之前上面已经用一些语句去描述出,但他传统的这种啊。呃,这个实现方式,它不是用的一些接口语句。
38:02
有时候这个分析跟B都是比较困难的,他们也有很多这种新的数据格式。呃,都会带来很多的这种开发商的困难,或者说使用上的困难。然后Ella其实有很多这个,呃,额外的一个错误注入功能,那其实Ella他文章里并没有细说,其实很多这个异常是因为一些节点的这个重启或断联啊,然后或者一些错误的注入啊之类的,然后才引发的一些正常这个疫情可能是不存在,但是这个这些描述他在文章里可能都没有,那么。呃,详细对。然后本次分享只是针对这个文章的基本思想去进行讲解的更多详细内容,如果感兴趣大家其实可以非常推荐大家去深入的这个论,然后下面就来看一下这个,呃。
39:07
大家对本次分享看有什么呃。疑问,然后这边来回答一下。对,呃呃,有个问题是说前面提到的这个,呃,理论上是可复现的,那有没有一些情况是不可复现的?呃,其实有一些情况是比较难以复现,而且有一些情况它是比较复现起来是比较特殊,比如说他有一些是需要很强的一个,呃。并发水平去压测,它才会让他有更大的概率去把呃去去去去出现出来,那比如说我们有一些测试,它的单机上,它没有这个时延,它这个压测比较高,诶它它那个压可能每十次它有一次它就会出现某种异常,但是如果把这个压这这种测试用到这个分布式上的一个场景去。
40:06
做的话,他有一些食盐的,导致他们的这个整体的那个压测上不来,他这个呃发现异常的概率也是呃很小的,像他征官方。他们测了一个数据库的,呃。有一个数据库,就是说有一个异常,他有他是好像测了每100个小时,它才会出现一个呃一个一个异常,所以有的时候他这个附件也是有一定的那个难度,这这个很大原因是因为这个他整体的一个流程,包括他呃读写的这个压测的这个形式都是很随机的。所以是,呃。都有一定的概率,它是不可以有一些情况那是很难出现,但是大概率上是说我们只要有,呃,有能跑出来,在某个环境下能跑出来一个异常,我们只要持续去跑,还是能现出来,但是换个环境,像之前说的单机分布式互换,它是不一样的,包括有一些异常,它也是一定要分布式下才能测,安静下它就测不出来。
41:14
然后第二个呃,问题是说这个是不是只适用于这个SQL语句,然后SQL语句是不是只有这些操作,目前这个Jackson上它是呃。呃,是只有这三种操作,对于事物来说,他只有这三种操作,然后他们其实不支持这个,不是简单支持这个机构,他是直接去,呃有一些API直接去对接这些。数据库的,比如直接用GDB去去调用了这样的一个情况,其实他是不支持接你用Q去去去改写。对,然后还有一个经常,呃,比较大家可能比较感兴趣的这个,呃呃,也是说诶,那我们或Jason,或者说我们到底测了哪一些数据库,或者说哪一些数据库,它是会有一些存在一些问题的,这个是非常推荐大家去,呃看这个真的官方他们其实做了很多测试,然后很多数据库的这些异常分析啊,都包括那个一些分析报告,这些异常是怎么出现,为什么会出现,他们都写成了一个很写成的很详细的一个分类报告在上面,所以都可以去。
42:30
呃,直接去去上面去拿到这些,呃解析对。然后呃,由于时间关系,本次我的这个分享就有可能。呃,基本上是这样,然后非常感谢。大家的参与,然后如果大家后续还有问题可以,呃,就是说关注我们的这个腾讯云公众号,然后也可以解锁更多的这种。
我来说两句