我希望我的程序能够安装插件,并回滚发生错误时所做的所有更改。所以我创建了一个事务,保留了安装插件时添加的所有内容。问题是插件可能想要创建表,并且这样做会自动提交MySQL中的当前事务。
请参阅MySQL网站上的Statements That Cause an Implicit Commit。
我对如何做到这一点有任何想法?
我想过使用临时表,因为它们没有自动提交,除非它们使用了太多内存,但看起来临时表无论如何也无法回滚(而且我还没有找到将它们转换为永久表的方法)。
我刚刚发现了“save points”,但我真的不明白应该如何/什么时候应该使用它,也不能帮助我实现我想要的目标。
答案 0 :(得分:2)
保存点不是答案;它们在事务提交时提交。保存点是您可以回滚的事务的中间点。
某些DBMS确实为您提供了DDL(数据定义语言)语句的完整事务支持,例如CREATE TABLE。其中之一就是IBM Informix Dynamic Server。
许多DBMS都没有为您提供此类支持。其中之一就是甲骨文。
基本上,您必须决定是否更好地使用/支持MySQL并且没有围绕DDL语句的事务支持,或者是否要迁移到提供所需功能的另一个DBMS。理论上,还有第三种选择 - 在MySQL中添加对DDL周围事务的支持。但这可能有点困难(但如果你做得对,整个MySQL社区都是非常值得的。)