支持事务的nosql数据库_事务性NoSQL数据库

支持事务的nosql数据库

Java平台在几乎整个生命周期中都经历了极大的痛苦,以使数据库持久性对开发人员尽可能地无缝。 无论您是在最早的JDBC规范,EJB,Hibernate之类的O / R映射器上还是在最近的JPA规范上,您都可能遇到过关系数据库。 也许同样有可能,您也已经了解了如何从面向对象的角度对数据建模与数据如何存储在关系数据库中之间的区别(有时被开发人员称为阻抗不匹配 )。

但是,最近出现了NoSQL数据库,从建模的角度来看,在许多情况下,NoSQL数据库提供了更自然的契合度。 特别是,面向文档的数据库(例如MarkLogic,MongoDB,CouchDB等)及其丰富的JSON和/或XML持久性模型有效地消除了这种阻抗不匹配的情况。 尽管这对开发人员和生产效率是一个福音,但在某些情况下,开发人员已开始相信他们需要牺牲自己已习惯的其他功能,例如ACID事务支持。 原因是许多NoSQL数据库不提供此类功能,但需要权衡取舍,以实现传统关系数据库无法提供的更大的敏捷性和可伸缩性。 对于许多人而言,进行这种折衷的理由根植于所谓的CAP定理。

CAP定理

早在2000年,埃里克·布鲁尔(Eric Brewer)提出了现在在技术界称为CAP定理的概念。 在其中,他讨论了分布式数据库上下文中的三个系统属性,如下所示:

  • 一致性:所有节点同时看到相同数据的概念。
  • 可用性:确保对系统的每个请求均收到有关其是否成功的响应。
  • 分区容限:一种质量说明,即使系统部分故障,系统仍可继续运行。

围绕CAP定理的共识是,分布式数据库系统最多只能提供上述3种功能中的2种。 因此,大多数NoSQL数据库都将其作为在处理数据库更新方面采用最终一致性模型(有时称为BASE –或基本上可用的,软状态,最终一致性)的基础。

但是,一个常见的误解是,由于存在CAP定理,因此无法创建具有ACID事务功能的分布式数据库。 结果,许多人认为使用分布式NoSQL数据库和ACID事务永远不会满足。 但实际上并非如此,而且Brewer本人也澄清了他的一些声明,特别是围绕一致性的概念,因为一致性概念适用于InfoQ上的 ACID 。

事实证明,对于较新的数据库技术,ACID属性非常重要,以至于它们的适用性已被解决或正在被市场解决。 实际上, Big Table白皮书和实现的作者与Google一样,对分布式Web规模数据存储的授权也不少于通过Spanner项目证明和实现分布式DB事务功能的过程。

结果,事务已经回到了NoSQL的讨论中。 如果您是寻求NoSQL敏捷性和可扩展性但仍希望企业期望ACID事务的Java开发人员,那么这是个好消息。 在本文中,我们将探讨一个NoSQL数据库(特别是MarkLogic),以及它如何为Java开发人员提供多语句事务功能,同时又不牺牲NoSQL所带来的其他好处,例如敏捷性和跨商品的横向扩展能力。硬件。 但是,在开始之前,我们先退后一步,重新熟悉ACID的概念。

酸支持

我们将从缩写ACID的教科书定义开始。 我们将定义每个术语,并讨论每个术语都很重要的上下文:

  • 原子性 :此功能提供了事务概念的基础,它指出数据库必须提供对可能以“全有或全无”方式发生的数据进行分组操作的工具。 因此,例如,如果创建了一项交易,其中一个操作记入一个帐户,而相关操作从另一个帐户记入借方,则必须保证它们作为一个整体发生(或不发生)。 此功能不仅在正常的运行时操作中而且在意外的错误情况下都必须为真。
  • 一致性 :与原子性紧密相关的属性,它指出在数据库上执行的事务必须将数据库从一个有效状态转换到另一个有效状态(从系统的角度来看)。 因此,例如,如果先前已在受事务影响的部分数据上定义了引用完整性或安全性约束,则一致性可确保不会因预期的事务而违反那些定义的约束。
  • 隔离 :此功能适用于以并行方式发生的有关数据库事件的观察到的行为。 它旨在为如何将一个特定用户的数据库操作与另一个用户的数据库操作隔离提供一定的保证。 对于此特定的ACID属性,通常存在多种并发控制选项(即隔离级别),这些选项不仅在一个数据库与另一个数据库之间不同,而且有时在同一数据库系统内也有所不同。 MarkLogic依靠一种称为多版本并发控制(MVCC)的现代技术来实现隔离功能。
  • 耐用性 :这确保一旦将事务提交到数据库,即使在正常数据库操作的意外中断(例如,网络故障,断电等)的情况下,它们也将保持不变。 本质上,这可以确保数据库一旦确认提交数据,就不会“丢失”数据。

在具有完全ACID支持的数据库中,上述所有属性通常都将结合使用,它们依赖于日记和事务检查点之类的概念来防止数据损坏和其他不良影响。

NoSQL和Java-基本的写操作

既然教科书定义部分已经过去,让我们更具体一些,并以Java代码的形式探索其中的一些属性。 如前所述,我们的示例NoSQL数据库将是MarkLogic。 我们将从一些家政用品开始。

当使用Java(或几乎任何其他语言)进行编码时,要与数据库建立对话,我们要做的第一件事就是打开一个连接。 在MarkLogic的世界中,这是通过DatabaseClient对象完成的。 为了获得这样的对象,我们采用工厂模式并如下查询数据库客户端 工厂对象:

// Open a connection on localhost:8072 with username/password
// credentials of admin/admin using DIGEST authentication
DatabaseClient client = DatabaseClientFactory. newClient ( "localhost" , 8072, "admin" , "admin" , Authentication. DIGEST );

一旦建立,就可以使用另一个抽象层次。 MarkLogic在其Java库中提供了许多功能,因此,出于组织目的将这些功能进行逻辑分组是很有帮助的。 在DatabaseClient级别上执行此操作的方法之一是将功能分组为许多Manager类。 对于第一个示例,我们将使用XMLDocumentManager对象作为执行基本插入操作的方法。 为了获得XMLDocumentManager的实例,我们再次转到工厂方法,但是这次是从DatabaseClient本身进行的,如下所示:

// Get a document manager from the client 
XMLDocumentManager docMgr = client.newXMLDocumentManager();

在处理数据时,MarkLogic被认为是“面向文档”的NoSQL数据库。 从Java的角度来看,这意味着不用依赖O /

你可能感兴趣的:(数据库,分布式,python,java,大数据)