NuoDB
by NuoDB

多澳门比分网址并发控制部分1:概述

问候,技术上思想诺纳人!我是Nuodb的工程师之一。我大部分时间都在实施和调试Nuodb的原子层。去年,我一直在生活和呼吸分布式交易一致性。最近,我有机会直接与Nuodb的客户和用户一起参与,其中一个常规出现的问题是我们如何在同时对多个节点面对荒谬的更新的一致性。事实上,答案是我们在分布式上下文中使用的多澳门比分网址并发控制(MVCC)的实现。然而,要完全理解,必须具有MVCC的体面处理。

我是一个很大的并发书呆子,我也曾经是一位老师,所以我有机会跳上解释技术事物。因此,我将通过在MVCC上发布一系列底漆来开始我的博客。首先,我将抽象地描述MVCC,然后我将潜入Nuodb如何利用MVCC语义来实现完全的事务分布式数据库。因此,没有进一步的ADO我会介绍MVCC。

MVCC.什么呢?

数据库是简单的灵魂。他们希望摄取您的数据,珍惜它,并以您要求的任何形式返回给您(程序员)。为实用性的缘故,任何值得其盐的数据库都应该尽可能多地处理许多请求。 SQL是一种声明性语言。这意味着您的普通SQL语句没有决定如何执行该语句,它只会在执行该语句时删除数据库应该在内部运行的参数。这意味着与数据库交互的程序员正在对数据库本身的细节进行控制。这是一件好事。真的。这意味着应用程序逻辑与数据存储的细节解耦。结果是数据库本身需要能够管理多个并发客户端。具体地,数据库需要处理多次事务(来自多个客户端)的情况,同时读取和编写同一条数据。

那些明白传统并发代码的读者可能会看这个并说'为什么不使用读/写锁定锁定'。这是一个合理的请求,多年来许多数据库采用(以某种形式或其他形式)。然而,这种方法存在严重问题。即,读者阻止作家和作家阻止读者。当然,这些是读/写锁的语义,并不太令人震惊。但是,这些语义可能对任何交易数据库都具有严重的性能影响。

考虑一个系统,其中有两种交易。一个是一个很大的长期读取交易,建立某种报告(或做一些新的分析)。只有其中一个人一次运行。其他类型的交易是一个简短的运行用户动作。几个读和写或两个。说这是一个订单请求或什么。可以有成千上万的这些家伙。读/写锁的问题是,如果在长期运行事务的读取数据集和任何短时交易的写入数据集之间存在任何重叠,则短事务可能必须阻止,直到长时间运行的事务完成。在今天的狂热世界中的淫艺世界等等,即使长期运行的交易真的只运行几秒钟,所以订单处理的延迟可能是不可接受的。因此,问题仍然是具有最高的并发性能可能,具有一些合理的延迟保证。理想情况下,如果事实上,事实上只能阻止另一个事实,真正对更新特定行更新的另一个交易(实际上,阻止只是数据库并发控制机制可以采用的一种方法)。在上面的信封之外的示例中,长时间运行的事务不应导致短时间内的事务阻止。除非它们实际上更新相同的行,否则不会彼此干扰/阻止两个短路交易。当读/写锁失败时,我们如何完成这样的壮举?至少对于Nuodb和许多现代数据库,答案是多澳门比分网址并发控制。

什么是mvcc?

伟大的',你可能会说,现在我知道MVCC应该解决的问题是什么问题。 “它是如何解决它的?”答案是名字。不是简单地为给定记录具有预定的存储点并进行一堆幻想锁定,DB允许给定记录具有多个同时澳门比分网址。更新现在安装一行的新澳门比分网址。因此,作家对向行的顶部澳门比分网址添加新澳门比分网址的权利,可以争取向行的顶部澳门比分网址,读者可以读取任何可见澳门比分网址。在上面的示例中,这意味着长时间运行的读取交易不会锁定任何内容。因此,它不能导致任何短路事务来阻止。并且,只有当两个(或更多)事务争夺特定行澳门比分网址的更新权限时,它们才能彼此干扰。如果一个人保持可见性信息,以便给定交易,可以找出可见行的行中的哪个澳门比分网址,然后可以使用MVCC来实现数据库的快照。实际上,当交易开始时,它将“冻结”将记录澳门比分网址的集合作为可见集。在该事务读取它们之后,对这些澳门比分网址的更新在逻辑上(即使正在执行该事务的线程没有物理读取该行澳门比分网址)。所有您需要支持MVCC语义的所有记录存储系统,允许您存储相同记录的不同澳门比分网址,允许某种锁定的系统,由此其他事务知道记录正在同时更新,以及允许的机制一个将记录澳门比分网址号转换为事务ID,以便可以进行可见性计算。

SQL和MVCC.

 鉴于MVCC系统,它可用于实现SQL语义。 SQL提供了各种“隔离级别”,它基本上是一个旋钮,允许程序员拨打他们所需的一致性级别(假设是较少的一致性,性能越多)。在MVCC的上下文中,这意味着当交易命中时,当交易被另一个事务更新的记录时,所采取的操作取决于隔离级别。在最低级别的一致性下,可以在更新事务承诺之前允许交易读取更新('脏读取')。丑陋,但快。下一个一致性将阻止脏读取,并且只读取从事务的可见性计算的澳门比分网址。这被称为“一致阅读”。更新更复杂。遇到遇到未提交的更新的记录澳门比分网址的更新尝试有两个选项,它可以直接吓坏并失败,或者它可以等待更新的事务完成并基于已提交状态进行决策。低孤立级别将快速失败,因为逻辑上,它们会在发生事务时看到事务的更新。高隔离/一致性水平需要阻止(或根据您的口味重试),直到已知记录的最终状态。

希望这让你对MVCC感兴趣的读者。