- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为一个带有 MySQL 数据库的大型应用程序编写测试。该语言使 Hook “提交”和“回滚”变得容易;那些具有 SAVEPOINT 技巧的测试允许我的测试临时更改数据库的状态,并在退出时将它们全部回滚。
但这是一个有很多贡献者的大项目,并且可能会在其中混入 DDL 语句。任何隐式提交的语句都会破坏将数据库返回到其原始状态的测试契约。有没有办法在任何执行隐式提交命令的尝试中强制出错?
注意事项:
read_only
变量看起来很有前途,但限制太多。我想允许插入/更新/删除语句。是否有类似但“更轻”的变量可以禁用 DDL?最佳答案
这里有两种解决方法,但都不能完全满足我的要求。
REVOKE CREATE, ALTER, DROP, LOCK TABLES on MyDB.* FROM 'testuser';
- 测试结束后在权限更改下执行 GRANT。这个看起来不错,但它需要一个具有 GRANT & REVOKE 权限的数据库用户。该应用程序的数据库用户没有它们,这是理所当然的。理想情况下,运行这些测试的开发人员不需要做任何额外的管理工作,例如获得额外的权限或创建新的数据库用户。
不使用普通事务,而是使用两阶段提交事务。这太棒了!它不需要任何特殊权限,它可以防止任何隐式提交,而无需我列出甚至不需要知道哪些语句导致这些提交,并且它是一个自行“消失”的更改。但是...它会干扰让我运行一些事务、回滚或中途提交并继续的保存点。这使得编写更改一些内容的测试并让检查测试并在稍后的测试中使用这些更改变得困难。
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/
我是一名优秀的程序员,十分优秀!