【问题标题】:How to implement the ACID model for a database?如何为数据库实现 ACID 模型?
【发布时间】:2010-11-24 08:45:14
【问题描述】:

Igo 如何为我的数据库实现 ACID 属性 - A-原子性,C-一致性,I-隔离,D-耐久性。 正在使用的数据库系统 - MySql。

【问题讨论】:

  • ACID 是数据库为您提供的东西,而不是您必须实现的东西。您可以使用 ACID 构建可靠的应用程序。

标签: mysql database


【解决方案1】:

好吧,ACID 不是您可以实现的模型,而是数据库服务器必须遵守的一组规则,以便能够以安全的方式处理事务。

MySQL 在设计上不是符合 ACID 的数据库服务器,但如果您为表使用 InnoDB 存储引擎(或者通过将 default-storage-engine 选项设置为InnoDB(参见default-storage-engine option)),您将能够对您的数据库执行事务安全操作。

我建议您将 InnoDB 设置为默认存储引擎,因为重要的是您不要在单个事务中混合使用具有不同存储引擎的表(例如 InnoDB 和 MyISAM 表)。否则,您可能会损坏您的数据,因为如果您回滚事务,您将无法回滚所有操作。

也就是说,您如何确保您的操作符合 ACID?只需对事务中的操作进行分组,即可从数据的一个一致状态到另一个,如果一切顺利,则在最后提交,如果出现问题,则回滚。为此,您需要通过发出START TRANSACTION 语句来告诉数据库服务器您的事务何时开始,以及何时以COMMITROLLBACK 语句结束。

在脚本开头使用SET AUTOCOMMIT=0 命令禁用自动提交模式通常是一个好习惯,尽管这不是强制性的,因为START TRANSACTION 命令实际上禁用了自动提交模式。

另外请记住,有些语句会发出隐含的 COMMIT 命令(基本上所有 DDL 语句以及其他一些语句,请参阅 Statements That Cause an Implicit Commit)。

您可能也有兴趣阅读与标准 SQL 在 MySQL Transactions and Atomic Operations 中处理事务方面的区别。

【讨论】:

    【解决方案2】:

    使用 MySQL 中的 innoDB 引擎,创建包含外键的适当数据库架构,使用事务进行相关查询,使用服务器级硬件并让数据库完成工作。

    http://en.wikipedia.org/wiki/ACID

    【讨论】:

    • 哦...谢谢。还有一个问题....数据库如何在硬件故障的情况下管理原子性?假设我有两个查询。 QUERY 1,QUERY 2,当这两个查询之间出现硬件故障时会发生什么?
    • 相关查询。查询编号。 2 永远不会被执行,这就是为什么如果这些查询是相关的,你需要事务:​​如果第一个查询是同一个事务的一部分,则整个事务永远不会被提交并且你的数据库仍然是正确的(ROLLBACK)。没有事务,您的数据库就会损坏。
    【解决方案3】:

    如果我理解正确,这不是你的任务。这是 MySql 开发人员 (Oracle) 的任务。 如果数据库服务器支持 ACID,您可以通过选择正确的隔离级别并使用事务(隐式或显式)来使用它。

    【讨论】:

      猜你喜欢
      • 2012-09-04
      • 1970-01-01
      • 1970-01-01
      • 2011-04-14
      • 2011-08-23
      • 1970-01-01
      • 2019-11-06
      • 1970-01-01
      • 2011-03-28
      相关资源
      最近更新 更多