【问题标题】:Transactional DDL workflow for MySQLMySQL 的事务性 DDL 工作流
【发布时间】:2015-03-27 15:12:54
【问题描述】:

我有点惊讶地发现 DDL 语句(alter tablecreate index 等)隐式提交 MySQL 中的当前事务。来自 MS SQL Server,在本地事务中进行数据库更改(然后回滚)的能力是我工作流程的重要组成部分。对于持续集成,如果迁移因任何原因而中断,则使用回滚,这样至少我们不会使数据库处于半迁移状态。

在使用 MySQL 进行迁移和持续集成时,人们如何解决这两个问题?

【问题讨论】:

  • 交叉张贴在 DBA 上:dba.stackexchange.com/q/90794/18273
  • 欢迎来到美妙的 MySQL 世界 :)
  • 你确定在 SQL Server DDL 命令中没有提交事务吗?因为在 oracle DDL 命令中也提交事务。
  • WWWOOOOOOOOOOOWWWW。如果这是真的,Oracle/MySQL 很糟糕。逆天。是的,我们确信 DDL 语句参与 Microsoft SQL Server 中的当前事务,并且不会像 Oracle 那样在每个语句之后自动提交事务(哇)。您如何看待 EntityFramework 能够对代码优先迁移进行建模,这些迁移可以在事务中应用和回滚,同时在其中包含许多 DDL 语句。这使得 MySQL 从根本上与 EntityFramework 之类的东西不兼容。为什么他们还要费心去整合它?

标签: mysql transactions continuous-integration rollback ddl


【解决方案1】:

一种可能性是以非破坏性方式进行 DDL 更改,其中包括:

  • 在 DDL/DCL(+1 全部反转)和 DML 中拆分逻辑
  • 仅运行 DDL/DCL 脚本添加列、新表、..
  • 取决于结果:
    • 成功后,应用 DML 更改,
    • 如果失败,请应用反向 DDL/DCL 脚本删除您要在第二步中添加的内容(显然有一些错误“不存在”,具体取决于第 1 步的距离)
  • 删除不再需要的内容,删除旧的列/表

【讨论】:

    【解决方案2】:

    DDL 语句会导致隐式提交,您对此无能为力。没有办法阻止这种行为。

    哪些 DDL 语句具有此行为随着时间的推移而变化,因此您需要检查您的版本。

    5.1 http://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html
    5.5 http://dev.mysql.com/doc/refman/5.5/en/implicit-commit.html
    5.6 http://dev.mysql.com/doc/refman/5.6/en/implicit-commit.html
    

    当我们只是扩展架构、新表/列/视图/procs/等时,不会影响现有代码,那么自动化就可以了,只需检查错误并修复它们。

    当它们会影响现有代码时,您需要根据具体情况制定策略。由于没有回滚,因此您需要自己的回滚计划,并且需要对其进行彻底测试。

    由于是个案,因此我无法针对您的特定情况提供很多帮助。

    【讨论】:

    • 感谢您提供相关文档链接。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-10
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多