2 mysql的purge线程知多少?
前段时间,作者分析了诸多种类的“云里雾里”的死锁状况,例如因为唯一性索引导致的死锁现象,因为操作空行而导致的死锁现象等,对mysql各种操作对数据页中的行的加锁情况基本解析完毕,但还有一类隐含地对数据行(被删除的行)的操作,就是purge线程。
purge线程的作用,是清理回滚段的同时,把被删除的行也从数据块中清除,实现真正的物理上的删除。
因此,作者就在猜想-----这个purge操作也是行操作,这类操作是否会加锁?
如果加锁,那跟用户线程的事务处理中的加锁会不会产生冲突?
如果冲突,那岂不是很难搞定,同时也会莫名奇妙?
因为mysql的管理员没有办法知道purge线程什么时候清理哪个被删除的行,正在清理哪个被删除的行。
希望这些顾虑都是多余的,从作者实际的运维经验中来看----目前为止,还没有发现是因为purge线程的干扰而出现死锁的现象。
好,废话说得太多了,我们还是来实际分析一下,purge线程在数据库中的核心函数吧。
purge线程的前段函数栈如下,可以看到有undo_rec这样的数据结构。
因为数据库的数据页特别多,要清除被删除的页,如果一个一个的找,那代价也太大了,是非常不明智的。......