H2Database SQL 插入流程

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
32
解析 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
如果该表还有辅助索引(二级索引)
将索引值和表的主键值插入到索引页中
更新索引也会记录 undo log
提交事务
判断事务是否更改过数据
如果 logId 不为0,表示记录过 undo log,表示当前事务更改过数据
在 undo log 里面增加一条记录,表示当前事务进行了提交
提交的时候,undo log 的部分数据是固定值,因为事务提交,undo log 只需要记录哪个事务 id 提交的即可
重新访问要插入记录的表的 btree,找到当前记录插入到表中的位置
将原来位置的对象由 VersionedValueUncommitted 更换为 DefaultRow
session 解锁