H2Database SQL 插入流程
插入数据时会先进行 SQL 解析,然后找到插入表对应的 Primary Index 对应的 BTree,然后根据二分法定位到插入的叶子节点,将 key(主键) 和 value(Row) 插入到指定的叶子节点.
解析 SQL
session 加锁
创建 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如果该表还有二级索引将索引值和表的主键值插入到索引 Page 中
提交事务判断事务是否更改过数据如果 logId 不为0,表示记录过 undo log,表示当前事务更改过数据在 undo log 里面增加一条记录,表示当前事务进行了提交提交的时候,undo log 的部分数据是固定值,因为事务提交,undo log 只需要记录哪个事务 id 提交的即可重新访问要插入记录的表的 btree,找到当前记录插入到表中的位置将原来位置的对象由 VersionedValueUncommitted 更换为 DefaultRow
session 解锁