【问题标题】:Is an ACID complaint SQL database is still "ACID" even when not explicitly using transactions?即使没有明确使用事务,ACID 投诉 SQL 数据库是否仍然是“ACID”?
【发布时间】:2018-06-11 10:11:20
【问题描述】:

假设我使用的是标准 SQL 引擎(例如 Postgres、MySQL...)。

如果我没有明确地说“开始交易”和“结束交易” 查询时

(如“插入学生......”),

  1. 它会“安全”吗?

  2. 我会丢失由 RDBMS 实现的“ACID”属性吗? 如果发出许多请求,我的应用程序现在会不一致吗?

  3. RDBMS 是否仅在我使用事务时保证 ACID?

  4. 我在应用程序代码中进行的每个写查询是否都必须是一个事务才能在我的应用程序中使用 ACID 属性?

【问题讨论】:

  • MySQL 是否正确兼容 ACID 是一个有争议的问题,但我认为 InnoDB 引擎兼容是普遍接受的。因此,只有在对数据集执行多个相互关联的查询时才需要事务。

标签: mysql sql sql-server postgresql transactions


【解决方案1】:

您所询问的行为确实因一个数据库而异。

对于 PostgreSQL 和 Microsoft SQL Server,如果您不使用“开始事务”...“结束事务”,那么每个语句都被视为一个事务。这种行为通常被描述为“自动提交”,您可以在 MySQL 中将其作为一个选项打开。

事务应该由您的应用程序需要什么来定义。经典案例是,如果您从我这里购买东西,那么这笔钱必须离开您的账户并作为一笔交易到达我的账户。要么两个动作都成功,要么都失败。所以在这种情况下,即使是自动提交,你也必须在两个语句周围加上“开始交易”...“结束交易”,否则钱可能会离开你的账户而没有到达我的账户,我们都会不高兴。

事实上,银行交易比这更复杂;这是一个简单的说明。

许多应用程序需要多个 SQL 语句作为一个单元发生,而对于这些,您总是需要事务。

行为的多样性意味着您必须检查文档。一些主要数据库(不是上面提到的三个)在各种事件上启动一个新事务,例如前一个事务的结束,或者一个 DDL 语句(在某些情况下创建、删除、更改和截断)。如果您需要事务,而大多数实际应用程序都需要,那么您必须检查您正在使用的数据库的文档,并进行大量多用户测试。

有一个较长的解释here 并且您选择使用的数据库的数据库文档是权威来源。

【讨论】:

  • 感谢您的详尽回答!因此,为了确保我完全理解,当“自动提交”行为开启(显式或默认)时,这意味着每次我对数据库执行单个查询时,它就像一个享受所有 ACID 的步骤的事务特性?并且当执行未包含在事务中的多个查询并且自动提交打开时,我只能分别保证每个查询的“ACIDity”?
  • 完全正确。使用自动提交,每个查询(插入、更新或删除)将完全执行或根本不执行(A - 原子)。数据库仍将保持一致 (C)。该语句将受到其他用户的保护 - 数据库将就像每个用户的查询一个接一个地执行(Isolated - I),结果将安全地存储在数据库中(Durable -D)。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-01
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多