![深入理解MySQL主从原理](https://wfqqreader-1252317822.image.myqcloud.com/cover/513/37423513/b_37423513.jpg)
1.4.9 统计值ONGOING_ANONYMOUS_TRANSACTION_COUNT的变更时机
由下面两个函数变更统计值。
(1)统计值 ONGOING_ANONYMOUS_TRANSACTION_COUNT 增加会调用 acquire_anonymous_ownership函数。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt001_52.jpg?sign=1739340868-5kyTEFneIUWeX2fERdMjB9Vm9UFa9fuL-0-87b8424946578dc29e163a3f3a1af3a4)
(2)统计值 ONGOING_ANONYMOUS_TRANSACTION_COUNT 减少会调用 release_anonymous_ownership函数。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt001_53.jpg?sign=1739340868-3Q0wWzw5wTfY97IzgHUegeyCLhzfUTCw-0-19d1c51017f593799e8deca1bb8d0562)
下面我们将分主库和从库两部分分别进行讨论。
1.主库
· 主库增加
当主库事务提交时,在order commit的FLUSH阶段分配GTID时,如果是匿名事务则会增加,主要由MYSQL_BIN_LOG::process_flush_stage_queue调入acquire_anonymous_ownership函数完成。
· 主库减少
当主库事务提交,order commit的COMMIT阶段进行InnoDB层提交后会减少,主要由MYSQL_BIN_LOG::process_commit_stage_queue调入release_anonymous_ownership函数完成。
2.从库
· 从库增加
当SQL线程或者MTS工作线程应用GTID Event时,如果发现是匿名的GTID Event,则会增加,主要由Gtid_log_event::do_apply_event调入acquire_anonymous_ownership函数完成。
· 从库减少
当SQL线程或者MTS工作线程应用XID Event执行InnoDB层提交后会减少,由Xid_log_event::do_commit调入release_anonymous_ownership函数完成。
我们可以看到,统计值ONGOING_ANONYMOUS_TRANSACTION_COUNT实际上就是没有提交完成的匿名事务的数量。需要注意的是,主库和从库更改的时机是不一样的,主库在COMMIT阶段才进行更改,不包含语句的执行时间,从库则包含了执行时间,因此从库更容易观察到这个统计值,其可能的取值如表1-1所示。
表1-1
![img](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt001_54.jpg?sign=1739340868-6G1qjzb0PpHkr3BiHrG6pyBaAyG60CIW-0-84f0c455222ba3c50479e9d11d2eb22f)
在实际的测试中,如果从库的这个值不为0,那么从库不允许更改,报错如下。
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt001_55.jpg?sign=1739340868-ssL03d1SEhg3lUORnVbUY7idOjnmIxPD-0-443417d6f23d1d195922e3f40f8034e1)
![](https://epubservercos.yuewen.com/A01218/19823444008569806/epubprivate/OEBPS/Images/txt001_56.jpg?sign=1739340868-2UXdPDjRBmAPVHINTbSeNHrbXxRJVqmI-0-2bea42c70dc82383e42b15cc1a44a26d)
但是这个报错不能涵盖所有匿名事务存在的可能性,因此还是要人为地多观察。