Press "Enter" to skip to content

什么是ACID事务?

理解数据库事务中的ACID属性

Photo by Michal Matlon on Unsplash

在数据库操作的上下文中,事务指的是被视为单个逻辑工作单元并旨在使底层系统处于一致状态的操作。

通过确保所有操作在成功完成时都被执行,或者在任何操作由于某种原因失败时都不执行,来维护一致性。

ACID属性

数据库事务应符合所谓的ACID属性。这样的系统被称为事务性系统,并确保每个操作,包括读取、写入或更新都符合ACID属性。ACID首字母缩写代表A 原子性、C 一致性、I 隔离性和D 持久性。

原子性:该属性指的是将事务视为单个工作单元。如果事务中定义的任何操作失败,则不会提交任何操作,之前执行的操作将被回滚(如果有),底层系统将恢复到之前的状态。原子性可以防止数据丢失或数据损坏,因为只有在每个语句都成功应用时,事务才会被提交。

一致性:该属性确保所有事务遵守预定义的规则,以便每个事务在被提交后以可预测的方式执行,并始终使底层系统处于一致状态。

隔离性:事务性数据库系统允许多个用户同时与其交互。该属性确保由多个用户发起的并发事务不会相互干扰,以维护数据完整性。因此,单个事务中的任何操作在事务提交之前都不会在该上下文之外可见。

持久性:这个最后的属性确保每个提交的事务都会被保存,其影响将是永久性的,即使在系统故障的情况下也是如此。

如何在SQL中编写事务

现在我们对四个ACID属性有了基本的了解,让我们编写一个SQL事务来看它们的实际效果。请注意,我将使用BigQuery语法,这也可能适用于许多其他SQL语言,但这并不保证。

在下面的示例中,我们创建一个由两个语句组成的事务。第一个语句将在表mydataset.mytable中插入一条新记录,而第二个语句(故意)会引发错误,因为它试图进行除以零的除法运算。

在我们的代码片段的第二部分中,我们定义了回滚逻辑,以便在失败之前撤消所有所做的更改。由于SELECT 1/0语句会引发异常,INSERT INTO语句将被回滚,并且新记录将不会添加到目标表中。

BEGIN  BEGIN TRANSACTION;  INSERT INTO mydataset.mytable VALUES (1, 100, 'pending');  -- 通过尝试除以零来引发异常   SELECT 1/0;  COMMIT TRANSACTION;  EXCEPTION WHEN ERROR THEN    -- 如果引发异常,则回滚事务    SELECT @@error.message;    ROLLBACK TRANSACTION;END;

最后的想法

ACID属性是事务性数据库系统必须遵守的最基本概念之一,以确保和维护数据完整性、一致性和可靠性。此外,这些概念使多个用户能够在不危及这些特性的情况下与底层系统并发地进行交互。

如果您的日常工作需要与事务性数据库系统进行交互,熟悉这些概念非常重要。数据库事务提供的ACID属性将确保数据完整性,并使您能够以不影响其他操作和用户的方式处理故障和错误。

👉 成为会员 并阅读VoAGI上的每个故事。您的会员费直接支持我和其他您阅读的作者。您还将完全访问VoAGI上的每个故事。

作为 VoAGI 的会员,您的会员费的一部分将用于支持您阅读的作家,并且您将获得对每个故事的完全访问权限…

gmyrianthous.medium.com

👇 您可能还喜欢的相关文章 👇

ETL vs ELT:有何区别?

数据工程背景下 ETL 和 ELT 的比较

towardsdatascience.com

什么是 dbt(数据构建工具)

dbt 的简介:占领数据世界的温和方式

towardsdatascience.com

用 Python 进行图形代码

使用 Python 创建云系统架构图

towardsdatascience.com

Leave a Reply

Your email address will not be published. Required fields are marked *