H2Database SQL 插入流程

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 解锁
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FlyingZCC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值