【问题标题】:MySQL Create tables without committing current transactionMySQL 创建表而不提交当前事务
【发布时间】:2011-02-26 16:37:44
【问题描述】:

我希望我的程序能够安装插件,并在发生错误时回滚所做的所有更改。所以我创建了一个事务来保存安装插件时添加的所有内容。问题是插件可能想要创建表,这样做会自动提交 MySQL 中的当前事务。

请参阅 MySQL 网站上的Statements That Cause an Implicit Commit

知道我该怎么做吗?

我考虑过使用临时表,因为它们不会自动提交,除非它们使用太多内存,但看起来临时表无论如何都无法回滚(而且我还没有找到将它们转换为永久表的方法)。

我刚刚发现了“save points”,但我真的不明白应该如何/何时使用它,也不知道它是否能帮助我实现我想要的。

【问题讨论】:

    标签: mysql transactions commit


    【解决方案1】:

    保存点不是答案;它们在事务提交时提交。保存点是事务中可以回滚到的中间点。

    某些 DBMS 确实为您提供了对 DDL(数据定义语言)语句的完整事务支持,例如 CREATE TABLE。 IBM Informix Dynamic Server 就是其中之一。

    许多 DBMS 不为您提供此类支持。甲骨文就是其中之一。

    基本上,您必须决定是使用/支持 MySQL 并在不支持 DDL 语句的事务支持的情况下生存,还是迁移到提供您需要的功能的另一个 DBMS 更好。理论上,还有第三种选择——在 MySQL 中添加对围绕 DDL 的事务的支持。不过,这可能有点困难(但如果你做得对,对整个 MySQL 社区来说非常值得)。

    【讨论】:

    • 好的,谢谢您的信息。甚至不知道甲骨文不支持它。我的应用程序使用允许支持不同 DBMS 的抽象层,因此我无法真正深入研究它们中的每一个并添加对 DDL 上的完整事务的支持......即使它只是 MySQL,它也可能太复杂了给我!
    猜你喜欢
    • 2017-11-18
    • 1970-01-01
    • 2013-05-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-19
    相关资源
    最近更新 更多