Martin
by Martin Kysel

交易锁定如何支持零开销分布式DML

让我们想象一种需要防止MVCC写歪斜的场景......

一笔交易将每个人的工资增加10%;另一个事务将新员工插入X.自从两次交易不冲突以来,MVCC不会阻止其中任何一个都会提交。经过解决方案两者,该部的总体工资可能高于预算。为防止类似的情况,应用程序开发人员可能希望拥有对表的独占访问权限。

NOODB 3.2.2公开了一种新型锁,可确保在分布式群集中独占访问资源。我们称之为事务锁,它们是新诺贝布的潜在机制 锁定声明.

零正常壳体开销

NuodB是分布式数据库。当我们设计事务锁时,我们的主要关注点是快乐的路径 - 您执行千次秒的DML,不支付分布式操作的成本。

阅读DML事务(选择)将永远不会获取任何锁定。保证了一致性 多版本并发控制。包含多个SELECT语句的一致性读取事务可保持数据库的一致元数据模型,而不管并发模式修改。

编写DML事务(更新,插入,删除,选择更新)获取共享锁。这些锁是运行事务的事务引擎本地。除非已经获得了独家锁,否则获取此锁将始终成功,并且不会与任何其他读取或写入DML操作冲突。这些共享锁不会在整个群集中分发,序列化,传送或复制。真正零开销。

支付成本:需要唯一访问的事务

生活中没有任何内容是免费的,也没有分布式一致性。由于共享锁在整个群集中未知,因此需要对资源进行独占访问的任何操作需要支付成本。

一个操作,需要独占访问更改的资源,需要等待所有与共享锁的所有事务引擎上的所有交易。一旦已解决所有事务(提交或回滚),请求者具有独家访问权限。

事务锁确保请求操作最终获取独占锁,避免任何饥饿。作为Nuodb应用程序开发人员,您应该确保飞行中没有长期运行的编写DML语句。独家请求者必须等待任何长期运行的交易,可能锁定其他作家。长时间运行的分析选择查询不会与事务锁冲突。

锁定SQL语句

所有写入DML都会自动获取共享锁,而无需任何用户干预。截至3.2.2,没有自动获取独占锁。

如本文的引入中所述,当您的应用程序想要具有唯一访问资源时可能存在情况。我们为您提供 锁定声明 这确实如此。请记住,在分布式系统中独家和/或独特的任何东西都可以对整个群集产生影响。

使用事务锁时,NOODB建议:

  • 确保你有 自动外套 或者您开始​​通过新的交易 开始交易.
  • 您的交易使用 阅读承诺。一致的读取事务无法看到拍摄快照后发生的所有更改。这可能导致锁定事务上的许多更新冲突,这将阻止您更改元数据。
  • 没有长期运行的DML事务。

我们没有提供手动锁定共享模式资源的能力。所有写入DML都会获取共享锁。为防止在表上获取独家锁,Nuodb建议执行虚拟更新 更新设置i = i其中0 = 1;

没有解锁

事务锁不能自愿释放。解锁资源的唯一方法是提交或回滚事务。

一旦获得,锁被保持用于当前事务的其余部分。没有解锁表命令;锁在交易结束时始终释放。

更多阅读

我们将探讨交易锁的技术基础 in future articles.

---

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