gpt4 book ai didi

mysql - 如何防止 MySQL session 中的隐式事务?

转载 作者:行者123 更新时间:2023-11-29 05:55:56 25 4
gpt4 key购买 nike

我正在为一个带有 MySQL 数据库的大型应用程序编写测试。该语言使 Hook “提交”和“回滚”变得容易;那些具有 SAVEPOINT 技巧的测试允许我的测试临时更改数据库的状态,并在退出时将它们全部回滚。

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

注意事项:

  1. read_only 变量看起来很有前途,但限制太多。我想允许插入/更新/删除语句。是否有类似但“更轻”的变量可以禁用 DDL?
  2. MySQL 是否有任何“ Hook ”或“回调”机制来拦截调用,无论是 session 中的所有调用,还是仅某些命令?如果是这样,那么我可以编写一个过程,该过程只对任何隐式提交命令抛出异常。
  3. 我确实有一些解决方法,我会在答案中给出。如果有人有更好或更有趣的答案,我们会接受。

最佳答案

这里有两种解决方法,但都不能完全满足我的要求。

  1. REVOKE CREATE, ALTER, DROP, LOCK TABLES on MyDB.* FROM 'testuser'; - 测试结束后在权限更改下执行 GRANT。这个看起来不错,但它需要一个具有 GRANT & REVOKE 权限的数据库用户。该应用程序的数据库用户没有它们,这是理所当然的。理想情况下,运行这些测试的开发人员不需要做任何额外的管理工作,例如获得额外的权限或创建新的数据库用户。

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

mysql> XA START 0x123; -- Query OK, 0 rows affected (0.00 sec)

mysql> insert into temp_yh_test values(0,'popbus'); -- Query OK, 1 row affected (0.00 sec)

mysql> create table temp_new_1 (id int NOT NULL AUTO_INCREMENT, xyz varchar(40), primary key (id)) ENGINE=InnoDB; -- ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed when global transaction is in the ACTIVE state

关于mysql - 如何防止 MySQL session 中的隐式事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49392430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com