对MySQL来说,每次事务如果有对表进行增删改,那么则会分配一个事务ID,以表示哪些增删改操作是该事务产生的。
内存上:
系统会在内存中维护一个全局变量存储当前最大事务ID值,每当开始一个新事务时,就会把这个值赋给该事务,然后这个变量自增1。
每当该变量是256的倍数时,就会将该变量的值刷新到磁盘中。
物理上:
在系统表空间中页号为5的页面中,有一个名为Max_Trx_ID的变量,用于存储当前记录的最大ID的值。每次系统重新启动,都读取该变量的值,然后+256,读到内存中。为什么要+256呢?因为可能会系统异常退出,此时内存中的值还没有刷盘,所以要加上256,防止事务ID冲突,缺点时会存在跳号的情况,但是这是我们可以容忍的,因为最大也就浪费256个号。
总结:
这篇文章想表达的是,我们日常在开发的过程中,可以常常思考哪里可以优化性能,会造成什么影响,如何保证数据一致性。从MySQL的事务ID处理可以学习到,当需要提高性能时,可以把数据存储在内存中,并且按照一定的规则刷新到磁盘中持久化,而不是每次都刷盘,因为每次刷盘代表造成IO,当然这需要看具体需求,重要数据就不能这么做。另外为了防止系统崩溃造成事务ID冲突,MySQL的策略也很巧妙,直接加上256就好了。