二、事务的本质(内核视角)
真实的事务到底是什么?
事务=磁盘上 XID 文件 1 字节状态位+WAL 文件里一串 xid 前缀的 redo 记录+.db 文件里所有 xmin/xmax 刻了这个 xid 的行指纹;再配上内存里 4 张 ConcurrentHashMap 记录这个事务的开始时间、持有锁、WAL 字节数、修改行数/UNDO 字节数。所有这些分散在不同文件不同位置的字节,合起来此时一个事务
(一)事务的不同状态
活动的(active):
部分提交的(partially commited):事务操作完成了,但数据所造成的影响还没刷新到磁盘。
失败的(failed):
中止的(aborted):回滚到了执行事务之前的状态,相当于什么都没做。
提交的(commited):修改的数据刷新到磁盘

(二)事务大小怎么看?
(三)什么叫大事务(6 个纬度)
大事务=把 ACID 四大机制的 IO/锁/内存/时间代价放大几百倍,放大到 DB/业务撑不住
一、MySQL 官方:一个会写 redo log 超过 10MB 的事务
二、MySQL 官方:修改行数=10000 行:200B*10k 行=2MB=3 个叶子页,最多出发 2 次叶子页分裂,>10k 分裂指数级增长
三、持有锁数量=1000 个锁:死锁检测是 O(n*2),1k 锁死锁检测跑 100 万次图遍历=30ms;10k 锁=1 亿次便利=2.7 秒
四、UnDo 日志体积=5MB:会阻塞 b+ 树 split/merge
五、事务生命周期时长=300 秒
六、MVCC 版本链跳转深度=100 次
(四)日志时间
fc.force 就是刷盘
insert 完 WAL=1 次磁盘同步
insert 产生的 redo log(WAL)写完后必须立刻 fc.force 落到磁盘
(五)工业界 ARIES 恢复算法
2 大原则
原则 1:Write-Ahead Logging(先写日志)
任何“要把真实 data page 改写到磁盘”的动作发生之前,必须保证对应的 redo log 记录已经 fsync 到磁盘。
