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 解鎖