mysql - 使用 SQL 脚本和事务管理 mysql 模式更改

标签 mysql transactions rollback

我在 PHP/MySQL 应用程序中使用多个数据库。我有开发、测试、登台和生产数据库来保持同步。

目前我们仍在构建这个东西,所以很容易让它们保持同步。我使用我的开发数据库作为主数据库,当我想更新其他数据库时,我只是核对它们并从我的数据库中重新创建它们。但是,将来一旦有真实数据我就不能这样做了。

我想将 SQL 脚本编写为文本文件,我可以使用 svn 中随附的 PHP 更改对其进行版本控制,然后在我更新它们时将脚本应用于每个数据库实例。

我想使用事务,这样如果脚本期间出现任何错误,它将回滚所做的任何部分更改。所有表都是InnoDB

当我尝试添加一个已经存在的列,并像这样添加一个新列时:

SET FOREIGN_KEY_CHECKS = 0;
START TRANSACTION;
ALTER TABLE `projects` ADD COLUMN `foo1` varchar(255) NOT NULL after `address2`;
ALTER TABLE `projects` ADD COLUMN `foo2` varchar(255) NOT NULL after `address2`;
COMMIT;
SET FOREIGN_KEY_CHECKS = 1;

...它仍然提交新列,即使它未能添加第一个列,当然,因为我发出了 COMMIT 而不是 ROLLBACK。

我需要它在出错时有条件地发出回滚命令。我如何在即席 SQL 脚本中执行此操作?

我知道存储过程的“声明退出处理程序”功能,但我不想存储它;我只想将它作为临时脚本运行。

为了获得条件回滚,我是否需要将它变成存储过程,或者是否有另一种方法可以在单个即席 SQL 脚本中使整个事务原子化?

欢迎提供指向示例的任何链接 - 我用谷歌搜索但目前只找到存储过程示例

非常感谢

伊恩

编辑——这永远行不通; ALTER TABLE 在遇到时会导致隐式提交:http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html感谢 Brian 的提醒

最佳答案

前几天我了解到,数据定义语言语句总是在 MySQL 中起作用,并在应用它们时导致事务被提交。如果您想确保成功,我认为您可能必须以交互方式执行此操作。

我在这个讨论过这个问题的网站上找不到这个问题(就在几天前)。

如果您需要保持多个数据库同步,您可以研究复制。虽然复制不是小事,但它可能正是您所需要的。参见 http://dev.mysql.com/doc/refman/5.0/en/replication-features.html

关于mysql - 使用 SQL 脚本和事务管理 mysql 模式更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3413674/

相关文章:

oracle - 回滚对提交的更新语句的更改

java - 如何从 @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Throwable.class) 中排除特定异常?

transactions - EJB 3.1 TransactionAttributeType.REQUIRES_NEW 和 setRollbackOnly

java - 使用 MySQL 中的数据填充 JComboBox

php - AJAX 响应和 PHP 循环

php - 根据用户输入过滤结果

node.js - 事务mongodb

MySQL InnoDB : Difference Between `FOR UPDATE` and `LOCK IN SHARE MODE`

java - mysql jdbc 不成功回滚

php - MySQL 插入 : Avoid duplicates w/multiple cols