MySQL的事务性DDL工作流程

时间:2015-01-28 16:11:40

标签: mysql transactions continuous-integration rollback ddl

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

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

2 个答案:

答案 0 :(得分: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

当我们只是扩展模式,新表/ columns / views / procs / etc,它们不会影响现有代码,然后自动化就可以了,只需检查错误并修复它们。

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

由于具体情况,我可以为您的特定情况提供帮助。

答案 1 :(得分:2)

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

  • 在DDL / DCL中拆分逻辑(+1反向全部)和DML
  • 仅运行DDL / DCL脚本添加列,新表,..
  • 取决于结果:
    • 成功后,应用DML更改,
    • on fail,应用反向DDL / DCL脚本删除你想要在第二步中添加的内容(显然有一些错误“不存在”取决于步骤1到达的程度)
  • 删除不再需要的内容,删除旧列/表