Martin
by Martin Kysel

分布式事务锁

正如我解释的那样 以前的博客文章,有时MVCC不足,并且操作需要阻止所有其他并发修改。 NOODB能够锁定三种类型的可锁定资源:表格,模式和序列。资源可以锁定在共享模式(仍然允许记录修改,但没有元数据修改)或无法阻止任何并发修改的独占模式。

访问所有记录(例如,示例各种索引操作)和分布式并发访问的DDL不可能进行独占访问。 Operive Access也可以通过需要在MVCC写歪斜异常之间工作的操作来使用。

共享锁需要快速,消耗尽可能少的内存,涉及群集中的额外节点,并不会导致额外的消息传递。

另一方面,独家锁,需要支付成本。

MVCC使用行锁定到序列式更新到单个记录。交易锁和行锁都参与相同的死锁检测过程,但是否则是独立的。下表介绍事务锁和MVCC行锁之间的交互。如果您有兴趣行锁如何工作,我建议阅读我们的 MVCC博客系列.

行锁(DML)/事务锁 共享 独家的
选择 没有冲突 没有冲突
插入,更新,删除,选择更新 没有冲突 冲突

 

使用事务锁

事务锁与交易的寿命相关联。如果没有交易,则无法存在锁定,并且在交易仍然存在时无法释放。释放事务锁的唯一方法是解决事务。目前有三种方法可以解决事务:提交,回滚和失败(本地或群集)。

锁定锁定,直到另一个节点可见交易的所有效果。如果事务TX连接到TE T,如果它不修改任何锁定资源,则不需要等待锁的分辨率。

与编程语言互斥锁类似,一旦获得共享或独占锁定,事务需要验证自交易开头以来发生的更改。这是读取的承诺事务很简单,因为它们不保证跨语句的一致快照。 RC交易将获取所有必需的共享锁,等待在过去可能获得的任何独占锁及其效果;只有这样它才能冻结它的可见性快照。此订购保证语句将看到数据库的最新,正确和一致的快照。

但一致的阅读交易呢?使用CR时,快照会及时冻结,无法更新。这意味着如果CR遇到独占锁定,则可能需要中止。如果承诺的独占操作,这可能意味着数据库的视图不再与CR事务兼容。如果它回滚或失败,Cr可以继续。如果CR无法继续,您将看到异常'表已更改'。 Nuodb只介于已被证明包含冲突更新的交易。

正如我上面解释的那样,事务锁类似于互斥锁,应该将其处理。使用它们时,我们建议检查;锁;检查模式。由于快照可见性的棘手性,Nuodb禁止在一致的读取事务中使用锁定语句。由于两者都在支票中检查语句;锁定;检查模式将用相同的快照执行,保证返回相同的结果。在授予资源授予资源之前严格发生的任何更新都不会反映在第二个检查中。要保护应用程序开发人员免受这样的错误,Nuodb不允许锁定语句以一致的读取隔离级别。

使用锁来防止写歪斜

写歪斜是MVCC中的知名异常,我们可能会在未来的文章中覆盖。快速底漆......

一张桌子包含三名员工鲍勃,玛丽,以及他们各自的薪水:

员工 薪水
鲍勃 100
玛丽 150
起诉 70

自公司拥有良好的季度以来,首席执行官现在开设了一个新的核准并批准所有现有员工的薪资增加。总成本不能高于500。

D1部门负责人介绍了总薪水,计算员工可以支付多少,并平等差异。在SQL中,这看起来像:


SQL > select sum(salary) as "Existing Salaries" from employees;

 Existing Salaries  
 ------------------ 

        320   
SQL > update employees set salary = salary + (select (500-sum(salary))/count(salary) from employees) ;
SQL > select * from employees;

 NAME  SALARY  
 ----- ------- 

 Bob     160   
 Mary    210   
 Sue     130   

SQL > select sum(salary) from employees;

 SUM  
 ---- 

 500  

同时,D2的部门负责人增加了一个新的员工:


SQL > select sum(salary) from employees;

 SUM  
 ---- 

 320  

SQL > insert into employees values('Chung', 500-(select sum(salary) from employees));
SQL > select * from employees;

 NAME  SALARY  
 ----- ------- 

 Bob     100   
 Mary    150   
 Sue      70   
 Chung   180   

SQL > select sum(salary) from employees;

 SUM  
 ---- 

 500

正如我们所看到的,这两个交易在MVCC中不冲突。一旦两笔交易提交,违反了CEO限制。


SQL > select sum(salary) from employees;

 SUM  
 ---- 

 680 

为防止这种情况发生,其中一个事务可以获取独家锁定。让我们通过锁定查看第二次交易。我们将使用支票;锁定;检查模式,如引言中所述。


SQL > start transaction isolation level read committed;
SQL > select sum(salary) from employees;

 SUM  
 ---- 

 320  

SQL > lock table employees; // blocks until T1 resolves
SQL > select sum(salary) from employees;

 SUM  
 ---- 

 500  
SQL > // Chung can not be hired

在引擎盖下

那么这个逻辑如何实现? NuodB不使用大多数共识算法,例如PaxoS或Raft;相反,诺德布取决于 主席。主席需要授予所有独家请求,以确保严格的订购。如果独家请求被拒绝,则事务将不得不等待当前持有者在可以重试之前解析。

独家锁定使用一种意图。主席广播了一个意图获取独家锁。所有其他引擎都将回复所有当前共享锁的集合。

一旦解决了所有共享锁,Intent都会被推广到独占锁定。一旦放置了意图,就无法放置进一步的共享或独占锁。没有任何额外消息的意图到独家的促销活动。

[图1.交易锁中涉及的生命周期和消息传递]

NuodB使用的可靠广播协议保证意图可以放置到处或无处。如果主席在锁定协议期间死亡,请求者将在重试之前等待一名新主席的选举。

由于使用Intent-Like锁,无法挨饿。另一方面,在请求者可以利用锁定之前,不完整的独家请求将阻止未来的共享锁。 NOODB假设专用锁是一个罕见的操作,并且应用程序开发人员了解分布式集群广泛访问的成本。长期连续的共享锁业主可以长时间锁定资源中的其他人。如果您注意到拍摄独家锁需要很长一段时间,请考虑咨询Nuodb伪表系统.Transactionallocks进行调试信息。

[图2.长时间运行的共享锁可防止表中的任何操作]

图2 如上,我们可以看到用户1的长期运行分析查询在表T1上拥有共享锁定时的情况。虽然该交易正在进行中,但可以在该资源上获取任何独占锁定。当DBA尝试更改表T1(这需要独占访问)时,她的事务将在现有的长期运行交易上放置意图和块。一旦放置了意图,就无法获取进一步的共享锁。允许所有已经拥有锁定的交易继续进行,但在意图已解决之前,没有新的事务可以获取锁定。在这种情况下,我们可以看到用户2无法插入表格。

以下是您可以在所描述的情况下从系统表中获取的信息 图2:


SQL > select * from system.transactionallocks;

 OBJECTID  TRANSID  NODEID  LOCKTYPE  SOURCENODE  
 --------- -------- ------- --------- ----------- 

    72       1410      2    Exclusive      2      
    72       1026      2    Shared         2      
SQL > select id,state, blockedby from system.transactions;

  ID  STATE  BLOCKEDBY  
 ---- ------ ---------- 

 1026 Active      -1    
 1410 Active    1026    
 1666 Active    1410   

要使系统继续,依赖关系图中的一个演员需要解决其事务(提交,回滚或失败)。

锁的成本是多少?

以下部分假定没有冲突 - 这与请求遇到已在位的冲突锁定。如果存在冲突,则锁定请求将不得不等待锁定的分辨率,从而等待具有该锁的事务。由于任何任意交易的寿命超出了NOODB的控制,因此我们将采用该等式。

获取共享锁(由NOODB自动完成)为零开销。我们通过各种内部绩效基准验证了这一点, TPC-C., 和 YCSB..

获取独占锁的成本是网络延迟的三倍。

  • 请求者 - >主席(MS中的网络延迟)
  • 董事长 - >所有其他节点(MS中的网络延迟)
  • 所有其他节点 - >请求者(MS延迟)

由于请求者需要从系统中的每一个TE获得授权,因此位于远程数据中心的TES的网络延迟可以是主要的决定性组件。

[图3.锁的网络延迟和成本]

每个锁都持续到交易结束。如果事务包含在不同资源上工作的多个语句,则所有这些资源都将被锁定。当您执行大型模式更改时,请记住这一点。

概括

我们已经了解到,昂贵的独特交易锁不用于正常的伯爵操作。 CUD操作可以使用共享锁定而不从集群中的所有节点进行显式批准操作。只需要一个专用锁定某些元数据修改以及特殊应用程序级使用情况。

您可以为任何类型的操作获取专用锁,需要对您的表格独占访问。可以使用独占锁来围绕写歪斜异常工作,但建议的方法是通过在众所周知的记录上添加额外的缺点更新来引起写入冲突。

NOODB不使用共识算法,而是取决于锁定分辨率的主席。

---

马丁凯尔斯Martin自2015年以来一直是Nuodb的一部分,Scrum Master和Tech Lead。他对平台和SQL之间的交叉路口的工作使他不仅可以了解Nuodb的战略差异化,而且还为已建立的球员的共同性了解。马丁对技术充满热情,通过谈判,文章和聚会分享他的知识。他10多年的经验涵盖了从DB /网络管理到高性能分布式软件工程的各种角色。