H2Database SQL 插入流程1234567891011121314151617181920212223242526272829303132解析 SQLsession 加锁创建 savepoint 获取or创建事务设置 savepoint执行 insert 插入操作 表权限校验 创建模板行 从 insert values 表达式获取值,设置到当前 row 里 将 value 转换成指定类型 table 加 share 锁 添加行数据 添加数据行到主键索引 获取根节点 二分查找定位到 btree 插入位置 记录事务 undo log 到 buffer 写入 undo log 时,会将 undo log 的 btree 加锁,当数据写入到 keysBuffer 和 valuesBuffer 后,便会解锁 h2 有后台线程会以固定频率将 keysBuffer 和 valuesBuffer 写入磁盘中 插入数据 key-value 到叶子节点 替换 page 更新 root page 如果该表还有辅助索引(二级索引) 将索引值和表的主键值插入到索引页中 更新索引也会记录 undo log提交事务 判断事务是否更改过数据 如果 logId 不为0,表示记录过 undo log,表示当前事务更改过数据 在 undo log 里面增加一条记录,表示当前事务进行了提交 提交的时候,undo log 的部分数据是固定值,因为事务提交,undo log 只需要记录哪个事务 id 提交的即可 重新访问要插入记录的表的 btree,找到当前记录插入到表中的位置 将原来位置的对象由 VersionedValueUncommitted 更换为 DefaultRowsession 解锁