H2Database SQL 插入流程
插入数据时会先进行 SQL 解析,然后找到插入表对应的 Primary Index 对应的 BTree,然后根据二分法定位到插入的叶子节点,将 key(主键) 和 value(Row) 插入到指定的叶子节点.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| 解析 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 解锁
|