Martin
by Martin Kysel

为什么和当您在数据库中需要交易DDL时

我们通常会在数据操作语言(DML)的上下文中讨论交易,但是当我们谈论数据定义语言(DDL)时,相同的原则适用。由于数据库越来越多地包括交易DDL,我们应该停止并思考事务DDL的历史。事务性DDL可以通过允许在单个操作中执行多种修改,帮助应用程序可用性,使软件升级更简单。您不太可能发现自己处理部分升级的系统,要求您的数据库管理员(DBA)用手进入并修复所有内容,失去他们的时间,减慢软件交付。

你为什么在乎?

如果您对应用程序代码进行了更改而某些东西不起作用,则不希望必须处理复杂的恢复。您希望数据库能够自动滚动,以便快速恢复工作状态。今天,通常人们不编写数据库代码,他们有框架(例如,Hibernate)。这使得软件工程师无法正确地编写代码,或者将其滚动,因为它们不适用于该级别。当您使用滚动应用程序升级进行更改时,它更简单,更可能失败,并且在您确实遇到失败时可以做些什么。

通过交易DDL,您将不得不处理一部基本上升级的系统,这将不得不处理将申请的部分升级到停止。部分升级,如此可能需要您的数据库管理员(DBA)进入并用手解决所有内容,失去时间的时间并减慢软件交付。使用事务性DDL,您可以滚动最后的工作升级并快速解决问题,而无需脱机。

对DML和DDL的简短解释

从本质上讲,DML语句是用于操纵数据的结构化查询语言(SQL)语句 - 您可能猜到。具体来说,DML类包括插入,更新和删除SQL语句。有时,我们将这三个语句称为编写DML,我们调用SELECT语句读取DML。标准在读写之间没有区分,但对于本文,这是一个重要的区别。

另一方面,DDL是用于定义数据库结构,特别是数据库模式的SQL语言元素系列。 Create,Alter和Drop命令是DDL SQL语句的常见示例,但DDL语言元素可以包括具有数据库,表,列,索引,视图,存储过程和约束的操作。

接下来,通过将事务定义为将事务定义为单独收集到单个逻辑单元中的命令序列,然后作为单个步骤执行交易。使用此定义,如果执行事务的执行中断,则事务未执行。因为交易必须是酸 - 原子,一致,隔离和持久,这意味着当事务执行多个语句时,其中一些是DDL,它将它们视为可以滚动或提交的单个操作。这意味着您永远不会将数据库留在临时非一致状态。从历史上看,数据库没有提供交易DDL语句的功能,但即使是今天并非所有数据库都提供了真正的事务DDL的功能。在大多数情况下,此功能具有局限性。

现在,真正的“交易DDL”是什么意思?这意味着所有陈述都应该是酸,无论它们是DML还是DDL语句。在实践中,使用大多数数据库,DDL语句会破坏封闭事务的交易并导致异常。

DDL. 的简要历史

最初,将数据定义语言的想法作为CodAcasyl数据库模型的一部分引入。 Codasyl是数据系统的会议/委员会语言,并在1959年形成了一个联盟,以指导开发标准编程语言,导致COBOL,以及许多技术标准。 Codasyl还致力于标准化数据库接口,从其成员促进更有效的数据系统分析,设计和实现的目标的所有部分。

1969年,Codasyl的数据库任务组(DBTG)发布了其数据模型的第一语言规范:用于定义数据库架构的数据定义语言,用于定义数据库的应用程序视图的另一个DDL,以及(您猜测它)数据操作语言定义的动词要请求和更新数据库中的数据。稍后的DDL用于指代表明表,列,数据类型和约束的SQL子集,并且SQL-92将架构操作语言和架构信息表引入查询模式。在SQL:2003中,这些信息表被指定为SQL / Schemata。

但是,DDL的交易性不是ANSI SQL标准的一部分。第17.1节  ANSI SQL 2016.  ()仅指定语法和支持的隔离级别。它没有指定交易应该如何表现或交易的方式。

为什么不普遍提供交易DDL?

没有理由为什么DDL语句不应该是交易的,而是过去,数据库尚未提供此功能。部分是因为事务性DDL意味着DDL必须以孤立,从同时发生的其他事务中发生。这意味着修改表的元数据必须是版本的。要正确地处理元数据,我们需要能够回滚由于事务回滚而中止的DDL更改。这并不容易 - 实际上它是一种复杂的算法任务,该任务要求数据库支持元数据Δ(差异),其对应于与数据库的每个连接的当前事务内的DDL改变。此Δ存在于事务关闭之前,因此它可以作为单个事务转回,或者在支持多级事务或保存点的RDBMS中滚动。基本上,它不是普遍提供的,因为它很难正确。

对于移动到MicroServices,Devops和CI / CD的组织,它们具有重要的新要求 - 一个支持在线交易DDL的数据库。

让我们返回我们的写入DML(更新,删除,插入)与读取DML的概念。您可能会问自己这些陈述如何在支持多个并发事务的系统中碰撞,并且正在进行DDL事务?理想情况下,碰撞的一组事务尽可能小。 SELECT语句不会与INSERT语句碰撞。没有理由在DDL的背景下应该是任何不同的原因。 DDL语句ALTER表不应阻止SELECT语句同时执行。这是数据库设计中的常见模式。

对于DDL,您需要同时支持多个版本。类似于多边形并发控制(MVCC),读者不会阻止作家,并没有阻止读者。没有MVCC,很难有交易DDL。传统上,数据库启动了锁定系统而不是MVCC。该实施不适合交易DDL,这就是为什么大约2005年朝MVCC转变大转移 - 提供对数据库的并发访问,并在编程语言中实施事务内存。

MVCC提供了我们可能自然渴望的语义。读取DML可以在冲突写入(写入DML和DDL)时继续执行。

在实时系统中编写DML和DDL

我们已经建立了读取DML(选择)可以愉快地继续,无论在系统中同时执行还有什么。写入DML(INSERT,UPDATE,DELETE)不允许在DDL并发修改的表上执行。根据所有并发事务的隔离级别解释冲突的语义,超出了本文的范围。

为了简化讨论,如果在同一资源上执行,则说明写入DML和DDL都是相互独占的。这导致彼此封闭的操作。如果您有一个长期运行的DDL事务,例如滚动升级应用程序,则将在很长一段时间内阻止写入DML。

因此,即使DDL是事务性的,它仍然可以导致数据库停机和维护窗口。还是这样做?

始终在线,始终可用

数据库行业正在展开始终在线,始终是可用的型号。早期的数据库导致一条消息说不可用的消息 - 这主要是因为你长时间抓住了数据库中的锁定。这不是一个始终在线的选项,始终是可用的型号。

客户,因此组织,需要申请在线和所有的时间。这意味着交易DDL对于新世界是强制性的,而且不仅对于应用程序来运行客户要求的方式。对于采用Devops和连续集成和连续交付模型的组织来说,也是强制性的(CI / CD)。具体而言,这是因为没有交易DDL,应用程序开发人员无法安全且轻松地使数据库模式更改(以及它们的应用更改)在线。这意味着对于移动到微服务,Devops和CI / CD的组织,它们具有重要的新要求 - 一种支持在线交易DDL的数据库。

我个人考虑在线误导的术语。在资源上锁定数据库并未脱机。更合适的术语将锁定免费DDL。也就是说,可以在不锁定并发DML的情况下发生元数据修改。

可用性与简单折衷

我们说写DML不能与DDL同时发生,以避免侵犯酸。现在,一个系统始终升级的系统会发生什么,需要执行长时间运行的DDL语句?幸运的是,大多数DDL陈述都不需要很长时间。添加或从表中删除列需要恒定的时间,无论表是多长时间。如果一组变化足够小,则可以在短时间内锁定DML。

但是有一些DDL语句需要在表格中处理每一行,因此可能需要很长时间才能处理大表。 Create Index是一个长时间运行语句的主要示例。鉴于索引创建可能需要多个小时,它不是始终在线的可接受选项,始终可用应用程序。

具体而言,对于索引创建,NuodB和其他数据库实现在线或并发版本(我希望将其称为锁定自由版本)。此版本允许DBA在不锁定表格或需要维护窗口的情况下创建索引 - 在24×7可用性世界中具有极其重要的能力。但是,这些能力不会免费出现。在线版本的常见DDL陈述往往比锁定版本略微慢,具有复杂的故障模式,难以理解酸语义。它们也不能成为更大的多账DDL交易的一部分。

有趣的是,有时执行速度不是主要问题。在这种情况下,您可能不想使用在线版本。您可能有一个需要复杂更改数据库模式的应用程序,并且有些锁定是一个更简单的升级过程的可行权衡。

原子性,酸的四种保证之一,州: “每个交易被视为单个”单位“,'无论是完全成功还是失败。”

如果我们将交易视为许多DDL语句,则这成为一种非常理想的质量。一个例子是:改变表;创建具有类似名称的日志表;将几行插入其他表。我们已经知道,如果DDL未经常对待,您最终可能会在其他表中结束新行,但是创建和ALTER成功都没有成功。或者你最终可能只是创造而没有改变。

因此,如果您有一个假设如果存在日志表(创建),它也可能假设发生了ALTER,如果升级没有完全完成,您可能会遇到生产中的微妙错误。事务性DDL使数据库管理员能够在单个操作中执行多个修改(例如上面的示例)。

对于开发人员来说,交易DDL的强烈隔离保证使得应用程序的发展更容易。应用程序只能在状态A(升级之前)或状态B(升级之后)中观察数据库,并且永远不会看到部分结果。这减少了所需的测试矩阵,并增加了滚动升级程序的置信度。现在,这很容易编写。

锁定升级的简单性之间的权衡和始终可用,始终在线在业内未在线知识,因为Interbase向商业市场引入了MVCC。

选择事务性DDL.

自1959年以来,数据库已更改了很多,并且从那时起,客户对用户体验和应用程序可用性有很多变化。事务性DDL有助于您避免您的应用程序不再可用的场景,并为您的DBA提供一些安心,知道它们不必煞费苦心地修复数据库,使您的软件交付恢复速度。如今,许多数据库提供交易DDL,这将通过回滚到最后的工作升级来帮助您快速解决即时问题。为了满足今天的始终可用的要求,请选择一个提供交​​易DDL的数据库。但请记住,现代始终可用,始终在线应用程序都需要一个数据库,不仅可以简化升级方案,而且由于长期运行的元数据修改,还限制了停机时间。

特征映像   通过  Pixabay.

最初发表在新堆栈中。