我有一个简单的用例要解决。想象一下,有人告诉你“嘿,这组特定的查询不是事务性的!” 而你的工作就是否认这种说法。怎么可能做到这一点?
假设:
- 用户可以通过触发的“单击一个魔术按钮”来重现这一点,让我们说 3 以下
INSERTs
- 我们有权访问
mysql client
和所有特权 - 我们无权访问应用程序的代码库,因此无法从代码角度进行集成测试来验证这一点
- 我们正在使用
MySQL
服务器InnoDb
- 我们可以根据需要调整 MySQL 配置(慢查询等)
输出中有一个事务部分:
SHOW ENGINE INNODB STATUS\G
看起来像(来自我的本地 MySQL 目前没有运行任何查询):
TRANSACTIONS
------------
Trx id counter 900
Purge done for trx's n:o < 0 undo n:o < 0
History list length 0
LIST OF TRANSACTIONS FOR EACH SESSION:
---TRANSACTION 0, not started
MySQL thread id 47, OS thread handle 0x7fc8b85d3700, query id 120 localhost root
SHOW ENGINE INNODB STATUS
不知道你能不能主动监控这个信息,让你在3次插入操作的瞬间就能准确的看到。您可能可以在这里使用您的最后一个项目符号(使用慢查询)...
此外 MySQL 有命令计数器。可以通过以下方式访问此计数器:
SHOW GLOBAL STATUS LIKE "COM\_%"
每次执行命令都会增加与其关联的计数器。与事务相关的计数器是Com_begin
、Com_commit
和Com_rollback
,因此您可以执行代码并监控这些计数器。