如何防止MySQL会话中的隐式事务?

如何防止MySQL会话中的隐式事务?,mysql,transactions,Mysql,Transactions,我正在针对一个带有MySQL数据库的大型应用程序编写测试。该语言使“提交”和“回滚”更容易挂钩;使用保存点技巧的测试允许我的测试临时更改数据库的状态,并在退出时将它们全部回滚 但这是一个有很多贡献者的大项目,可能会有一个DDL语句混合在其中。任何隐式提交的语句都会破坏将数据库返回其原始状态的测试契约。有没有办法强制执行隐式提交命令时出错 相关系数: read_变量看起来很有希望,但限制太多。我想允许插入/更新/删除语句。是否有一个类似但“更轻”的变量可以禁用DDL MySQL是否有任何“钩子”或

我正在针对一个带有MySQL数据库的大型应用程序编写测试。该语言使“提交”和“回滚”更容易挂钩;使用保存点技巧的测试允许我的测试临时更改数据库的状态,并在退出时将它们全部回滚

但这是一个有很多贡献者的大项目,可能会有一个DDL语句混合在其中。任何隐式提交的语句都会破坏将数据库返回其原始状态的测试契约。有没有办法强制执行隐式提交命令时出错

相关系数:

  • read_
    变量看起来很有希望,但限制太多。我想允许插入/更新/删除语句。是否有一个类似但“更轻”的变量可以禁用DDL
  • MySQL是否有任何“钩子”或“回调”机制来拦截调用,或者是会话中的所有调用,或者只是某些命令?如果是这样的话,那么我可以编写一个过程,在任何隐式提交命令上简单地抛出一个异常
  • 我确实有一些变通办法,我会把它们放在回答中。如果有人有更好或更有趣的答案,我会接受

  • 这里有两种变通方法,但都不能完全满足我的要求

  • 从“testuser”撤销MyDB.*上的创建、更改、删除、锁定表-测试结束后,在特权更改下授予。这个看起来不错,但它需要一个具有GRANT&REVOKE权限的DB用户。应用程序的数据库用户没有它们,这是理所当然的。理想情况下,运行这些测试的开发人员不需要做任何额外的管理工作,比如获取额外的priv或创建新的DB用户

  • 不要使用普通事务,而是使用两阶段提交事务。这太棒了!它不需要任何特权,它可以防止任何隐式提交,而无需列出甚至知道是哪些语句导致了这些提交,而且这是一个自行“消失”的更改。但是它干扰了让我运行一些事务、中途回滚或提交并继续的保存点。这使得编写一个改变一些事情的测试变得很困难&让检查测试并在测试的后面使用这些改变

  • mysql>
    XA START 0x123;——查询正常,0行受影响(0.00秒)

    mysql>
    插入temp_yh_测试值(0,'popbus');--查询正常,1行受影响(0.00秒)

    mysql>
    create table temp_new_1(id int NOT NULL AUTO_INCREMENT,xyz varchar(40),主键(id))引擎=InnoDB;——错误1399(XAE07):XAER_RMFAIL:当全局事务处于活动状态时,无法执行该命令