• 还在为数据库事务一致性检测而苦恼?让Elle帮帮你,以TDSQL为例我们测测 | DB·洞见#7


    数据库用户通常依赖隔离级别来确保数据一致性,但很多数据库却并未达到其所表明的级别。主要原因是:一方面,数据库开发者对各个级别的理解有细微差异;另一方面,实现层面没有达到理论上的要求。

    用户在使用或开发者在交付数据库前,需要对隔离级别进行快速的正确性验证,并且希望验证是可靠的(没有误差)、快速的(多项式时间)、有效的(找出异常)、通用的(任意数据库)、可解释的(可以debug,可以复现)。

    Elle 就是针对以上问题提出的一个基于 Adya 模型的黑盒一致性检测工具。Elle 通过精心设计的读写操作和版本控制,可以检验出 Adya 提出的所有非谓词异常,并且具有一定可解释性和复现性。在实践中,Elle 在所测的四个数据库上都测出了数据不一致。

    探索前沿研究,聚焦技术创新。本期由腾讯云数据库高级工程师陈育兴为大家介绍数据库事务一致性检测的技术原理及相关实现,包括背景、动机、解决方案等内容。

    一、背景介绍

    1.1 数据异常

    我们熟知的数据异常有脏读、脏写、丢失更新等很多种类,如果从数据异常的角度来解释一致性,即一致性是保证不出现数据异常。

    file

    我们以一个经典案例数据异常(写偏序(Write Skew))对此进行说明。某用户有两个投资账户,允许其中一个账户暂时亏损,但两个账户总额不能为亏损。转账前两个账户各有$100,两个事务同时开启,A事务查询总余额发现有$200,并在第一个账户取出$200,B事务查询总余额也是$200,并且在第二个账户取$200,两个事务都提交成功。各取出$200、总共取出$400,但按正常理解,超额取钱是不允许的,这种情况就是数据异常。然而这种操作在绝大部分数据库的默认配置中都会出现。

    file

    该例子的写偏序的标准测试样例如上图所示:初始数据库有两行数据,两个事务都各自读一行数据,两个事务分别更新对方读的数据,最后两个事务都提交成功,这就是标准的写偏序。这在很多数据库的默认级别和快照级别都会出现,用户通常需要额外的约束或需要数据库开启可串行级别才能避免该异常。

    1.2 隔离级别 VS 数据异常

    一致性有强弱之分,数据库中满足强/弱一致性需要通过隔离级别来实现。在某些弱级别下,异常的出现被视为正常,因为有些异常在部分业务场景下是可以被接受的。那我们为何要允许数据异常的出现,而不是禁止所有异常出现从而保证正确性?因为正确性和性能之间需要权衡,正确性越高,性能越差,允许一些数据异常,性能也会有所提升。

    file

    标准定义下存在四种异常,从P0到P3,逐步禁止,比如P0是脏写,在所有级别中都不允许出现;P1是脏读,在读未提交允许出现,幻读则允许在RR级别下出现;可串行级别理论上不允许任何异常出现。隔离级别越强,允许的异常就越少,且通常隔离级别为逐级叠加,即弱隔离级别不允许出现的异常,在更强的隔离级别也不允许出现。

    四种标准的异常只是数据异常中的一小部分,还有更多数据异常的形式。在四种标准的级别之上也有更多的隔离级别。

  • 相关阅读:
    MATLAB小技巧(21)矩阵分析--偏最小二乘回归
    金仓数据库兼容Oracle exp/imp的导出导入工具手册(3. exp/imp工具介绍)
    设计模式Java实战
    Qt Drag&Drop拖动与放置
    基于51单片机的多功能视力保护台灯
    将Word中的表格以图片形式复制到微信发送
    嵌入式linux系统中UART子系统基本实现
    Centos Docker部署Redis集群三主三从
    FPGA实现sobel边缘检测并Modelsim仿真,与MATLAB实现效果对比
    IIS 部署 SSL 证书提示证书链中的一个或多个中间证书丢失
  • 原文地址:https://blog.csdn.net/weixin_43872058/article/details/127867302