异常高效分类,知其所以然!腾讯TDSQL数据异常检测工具发布

2021-04-30 00:00:00 数据 操作 异常 冲突 输入

【ITPUB导读】:数据库领域数据异常研究,迎来了重要的历史时刻!腾讯TDSQL团队实现了有史以来世界范围内次对数据异常的精准分类。传统的并发访问控制算法,只能避免或消除数据异常,但不能识别出每一个数据异常是什么,而腾讯TDSQL团队所给出的算法,可以“精准”识别任何数据异常,且能知道该数据异常是什么样的数据异常。毫无疑问,这为研究隔离级别、并发算法等提供了新思路。



近,腾讯TDSQL团队,新入职一位超级肥胖的小企鹅,名叫小胖。小胖的工作职责是研发数据库内核引擎。

小胖天工作,很谦虚,在企业微信中开始了告白:

非常荣幸能够加入鹅厂,非常荣幸加入TDSQL数据库团队,希望能和大家一起成长和进步!(小胖刚刚在群里发完消息,突然感觉有人走了过来)

小胖你好!我是你工作的导师,我叫六鹅,欢迎加入TDSQL项目组,以后和我一起学习数据库中事务处理的艺术吧!

好啊好啊!我一定和导师好好学习!(好棒呀,我的导师看起来很和善,感觉很厉害的样子,以后能跟着大佬学习技术啦)

我们出去喝一杯饮料,和你聊一聊哈,看看你对事务处理这块了解到啥程度了哈。(好紧张,怎么突然觉得脑袋一片空白,哭…)

 六鹅:

今天呢,我想主要和你聊一聊数据库领域中由于事务并发所造成的数据异常相关的事情。不要紧张哈,这块内容是需要我们花时间花精力深入研究的,是一个长期的课题哦。我先问你一个问题哈,你知道哪些数据异常呢?

 小胖:

我想想...
脏读?不可重复读?幻读?
在我印象里好像只有这三种...

 六鹅:
还有吗,再想想

 小胖:
课本里面好像确实只提到了这三个,啊啊啊,我想起来了,我准备面试的时候,看到过一篇文章,里面还提到了丢失更新和脏写!(我的脑子还好没有宕机...)

六鹅:
还不错哦,那你有听说过读偏序、写偏序、读写偏序、写读偏序嘛?

 小胖:
这...是什么鬼,我晕了...

 六鹅: 
再接再厉,一次性问到终极问题了哦,你知道世界上有多少个数据异常嘛

小胖:
世界上...导师饶了我吧...小胖才疏学浅,还望导师赐教!

六鹅:
哈哈,没事没事,我们慢慢学哈,我可以先告诉你答案哦,世界上的数据异常个数是
无穷多个

 小胖:
啊?如果有那么那么多的异常,我们该怎么学习和研究呢...

 六鹅:
不用担心哈,我们之前的理论已经将无穷多个数据异常分好类啦!数据异常的数量是无穷多个,但是类别是有限个哦!这个,教科书里可没有写哦,这是我们TDSQL的科研成果哦!

TDSQL对事务处理的技术,进行了原创性工作。在我们的理论中,将数据异常定义为:
并发事务的一个History中,如存在一个依据冲突可串行化技术的有向环,则称为数据异常。这个定义,可是个对数据异常这个整体概念下定义的哦,之前的文献讨论数据异常,都是case by case的方式一个个讨论每一个具体的数据异常如前面你提到的脏读等,这样的方式,缺乏全局观,不利于认识数据异常,也不利于掌握并发访问控制算法哈!

而数据异常可分为如下三类:
写异常(WAT):环中有写写偏序。
读异常(RAT):环中有一个或者多个写读偏序,且不包含写写偏序。
交叉异常(IAT):除了写异常和读异常之外的异常。
更为细致的分类如下:
单元数据异常(SDA):数据异常发生在两个事务一个变量上。
双元数据异常(DDA):数据异常发生在两个事务两个变量上。
多元数据异常(MDA):除了SDA和DDA以外的数据异常。

  小胖:
这...让我想想...有些专有名词不太懂呀,环是个什么东东?偏序是个啥?变量又是指什么呢?

六鹅:
来这里,我在白板上给你画一画哈。我们这里环的全称是冲突环图(带有冲突操作的有向环图),图中的每个顶点是一个事务,而每一条有向边就是边的两个事务顶点的偏序关系。下面我们通过一个例子来说明哈。

图1 不可重复读
所图1所示,展示了不可重复读数据异常的冲突环图。首先给出冲突操作的定义哈,满足如下三个条件,才能称之为冲突操作:
  • 必须在不同的事务中
  • 操作同一个数据项
  • 其中之一必须是写操作
我们来观察一下上图,从T1到T2的边是对x的先读后写(T1先读,T2后写),在不同的事务中,操作同一个数据项(我们也称之为变量),且有写操作,属于冲突操作,我们把T1到T2的冲突操作也称之为T1到T2的读写偏序。同理,我们把T2到T1的冲突操作称之为T2到T1的写读偏序。两条冲突有向边加两个事务顶点构成了环,按照我们的理论,只要构成了冲突环图,异常则必然发生。异常发生后,我们又按照环中存在的偏序类型,对异常进行了分类,就是我们上边说的分类方法啦。

 小胖:
哇哦,我好像明白一些了,感觉好厉害的样子!
亲爱的导师,我想赶紧学习一下!有没有什么学习文档呀?

六鹅:
文档当然有啦,但是还有更好的学习工具哟!
我们已经开发好了快速学习数据异常的小工具!
它拥有如下特性:
  1. 支持Linux平台
  2. 支持数据异常精准识别
  3. 支持多种数据异常检测算法
  4. 用户友好的交互式界面

 小胖:
太棒了!可是。。linux我不太熟怎么办...

 六鹅:
没关系,我会给你提供全面的帮助!按照步骤执行即可哦!
立刻传送体验的佳姿势!
来,手把手教你在linux平台进行源码编译,获得可执行二进制:

a )  创建项目根目录
mkdir 3TS
b )  拉取源代码,注意这是TDSQL的开源项目哦!
wget https://github.com/Tencent/3TS/archive/refs/heads/master.zip
c )  解压文件
unzip master.zip
d )  进入源代码根路径
cd 3TS-master
e )  编译二进制。由于该程序基于C++17开发,需要编译器支持哦
./make.sh
f )  编译成功后,可以看到名为3TS-DAI的二进制哦。进入小程序的运行界面
./3TS-DAI

若提示“g++: error: unrecognized command line option ‘--std=c++17’”,则可尝试下载新版gcc,gcc官网:https://gcc.gnu.org/ (g++8以上的版本才会支持C++17哦)


 小胖:
历经千辛万苦,我终于进入程序啦!

六鹅:
你真棒哦!下面开始我们的体验之旅吧!
我们先来体验一下,小程序里面的命令吧~

进入系统后,输入help或者h查看帮助信息


通过输入‘\d [definition]’ 查看相关名词定义,你可以输入\d History看看效果哦


通过输入‘\a [anomaly name]’查看数据异常信息,你可以输入\a Dirty Read看看效果哦


通过输入‘\t [table name]’查看表格信息,你可以输入\t Anomalies看看效果哦


通过输入‘\A’查看作者信息,你可以输入\A看看效果哦

通过输入‘\q’退出系统,你可以输入\q看看效果哦

下面要进入正题喽!如何进行异常识别呢?

我们的小程序主要通过输入History来识别数据异常哦。‘History’是产生数据异常的操作序列,一个‘History’包含多个‘Operation’。一个Operation包含三个字符,例如R0x,分别为操作类型、事务编号以及数据项。操作类型包括:R:Read W: Write C: Commit A: Abort。事务编号包括:0,1,2...(必须是数字)。数据项包括:a, b, c...(必须是小写字母)。这个Operation的具体含义是事务0读取了x数据项的值。下面我们来构造History吧。

以脏读为例,需要输入的History长这个样子:‘R0a R1a W0a R0a W0a W1a A1 C0’。也可以通过输入\a Dirty Read 获取到History信息哦。

我们可以按照上述理论,画出该异常的冲突环图哈:

图2 丢失更新
然后,我们只需要将示例History输入小程序,小程序就会返回数据异常的信息啦!


怎么样,学会了吗,赶紧动手试一试吧!

 小胖:
谢谢师傅哈!我还有一个问题:这个小程序,背后是不是有啥理论支撑哦?

 六鹅:
哈哈哈,小胖,你真聪明。

鹅厂TDSQL出品的技术,都是有理论基础的,要做到有理有据。我们这个小程序背后,是鹅厂在事务处理技术的重要创新,里面干货多多,你快先挖掘感受下吧,下次咱们具体展开聊聊里面的核心技术哦!


相关文章