H2 Database 事务 Commit 流程实现原理
H2 Database 事务 Commit 流程实现原理使用测试 Demo:
123begin;insert into test values(1);commit;
功能模块类总体流程1234567891011121314解析 commit 语句执行 commit 语句 设置事务状态为已提交 根据 undoLogId 判断事务是否有更改操作,有更改继续提交 cas 设置当前事务状态为已提交到 committingTransactions 遍历 undoLog mvMap 追加标记 undoLog 已提交到 undoLog mvMap 上 获取当前 undoLog 操作涉及的 mvMap id 遍历到对应 Page 的对应 index 将 VersionedValueUncommitted 类型更新成 DefaultRow 类型清理操作 清理 undoLog mvMap(更新 root 节点为 empty) 清理事务状态 释放 table 锁
代码流程1234567891 ...
H2 Database SQL 插入流程
H2Database SQL 插入流程1234567891011121314151617181920212223242526272829303132解析 SQLsession 加锁创建 savepoint 获取or创建事务设置 savepoint执行 insert 插入操作 表权限校验 创建模板行 从 insert values 表达式获取值,设置到当前 row 里 将 value 转换成指定类型 table 加 share 锁 添加行数据 添加数据行到主键索引 获取根节点 二分查找定位到 btree 插入位置 记录事务 undo log 到 buffer 写入 undo log 时,会将 undo log 的 btree 加锁,当数据写入到 keysBuffer 和 valuesBuffer 后,便会解锁 h2 有后台线程会以固定频率将 keysBuffer 和 valuesBuffer 写入磁盘中 ...
H2 Database MVStore 初始化
H2 Database MVStore 初始化作用MVStore(multi-version store):H2 的默认存储子系统,支持多版本,持久化的、日志结构 的 键值存储。
功能123456789101112Maps 每个 store 包含多个 mvMaps,可以通过 java.util.Map 接口访问Versions 支持多版本Transactions 支持事务(并发事务&两阶段提交)Concurrent Operations and Caching 支持并发读写Log Structured Storage 日志结构化存储支持文件存储和内存操作支持可插拔
文件存储格式12345# 文件存储格式[ file header 1 ] [ file header 2 ] [ chunk ] [ chunk ] ... [ chunk ]# chunk 存储格式[ header ] [ page ] [ page ] ... [ page ] [ footer ]
12345结构 File Header 文件头 Chunk Form ...
H2 Database IDEA 环境搭建
H2 Database IDEA 源码 DEBUG 环境搭建基于最新的 version-2.3.230 拉取分支。
123git remote add h2 https://github.com/h2database/h2database.git git fetch h2git checkout -b version-2.3.230 version-2.3.230
使用12345# 启动java -jar h2*.jar# H2 shell 方式使用java -cp h2-*.jar org.h2.tools.Shell
h2 shell启动类 org.h2.tools.Shell
12# 配置启动参数-url "jdbc:h2:~/test" -user "sa" -password ""
测试 casecreate table + insert
1234567891011121314151617181920212223242526272829303132333435363738394041Welcome to H2 ...
Apache Omid Client 组件实现原理
Apache Omid Client 组件实现原理作用通过 TransactionManager 开启/提交/回滚事务,提供事务内快照隔离级别的读写操作。
使用123456789101112131415// 1.创建 transaction managerTransactionManager tm = HBaseTransactionManager.newInstance();// 2.通过 transactin manger 开启事务Transaction tx0 = tm.begin();// 3.事务内插入数据byte[] rowId = rowIdGenerator.getRowId();Put initialPut = new Put(rowId);initialPut.addColumn(family, qualifier, initialData);txTable.put(tx0, initialPut);// 4.事务内读取数据Get tx2Get = new Get(rowId);tx2Get.addColumn(family, qualifier ...
Ubuntu Desktop Docker 配置代理
Ubuntu Desktop Docker 配置代理主要解决 docker pull 拉取不了镜像问题.
Docker Desktop 配置代理这个比较简单, 直接在 Docker Desktop 里设置 Proxies, 示例如下: http://127.0.0.1:7890
Docker Engine 配置代理1.Docker Engine 使用下面配置文件即可, root 用户可以正常使用;2.非 root 用户,如果安装了 docker desktop 需要通过 docker context 切换到 docker engine;
docker pull 是由守护进程 dockerd 执行,因此代理需添加在 dockerd 的 systemd 配置中。
1sudo mkdir -p /etc/systemd/system/docker.service.d
12# 创建并编辑这个文件sudo vim /etc/systemd/system/docker.service.d/proxy.conf
添加下面内容,和给 bash 添加代理是类似的。
123[Service]Envir ...
安装 PaddleOCR
安装 PaddleOCR创建 conda env。
12345# 创建 conda envconda create --name paddle_env python=3.8source activate paddle_envconda activate paddle_env
安装 paddle。
12345# 安装 paddlepaddle,使用清华源pip install paddlepaddle -i https://pypi.tuna.tsinghua.edu.cn/simple/# 安装 paddle hub,使用清华源pip install paddlehub -i https://pypi.tuna.tsinghua.edu.cn/simple/
安装 paddle ocr 中文识别服务。
1234567# paddle ocr 中文识别,可以部署成服务http调用# 安装依赖pip install shapely pyclipper# 安装ocrhub install chinese_ocr_db_crnn_server
使用:
12345678910# 使用 de ...
Android 使用 ADB 调试
Android 使用 ADB 调试ADB 安装方式1: 通过 sudo apt install android-tools-adb 安装,试了下版本比较老了,用不起来.
方式2: 按照官网说明下载 Android Studio 或独立的 SDK 平台工具,两者都内含 ADB。下载完成后,配置环境变量.
12# vim ~/.bash_profileexport adb="/home/flyingzc/Android/Sdk/platform-tools/adb"
手机端设置:1.启用开发者选项2.启用USB调试
使用 ADB 连接手机方式1: USB 连接然后直接通过 usb 连接手机 和 电脑即可。运行 adb devices, 查看连接的设备。
12345➜ ~ adb devices* daemon not running; starting now at tcp:5037* daemon started successfullyList of devices attached5f541edd device
方式2: wifi 连接通过无线网方式连接:a ...
Apache Omid TSO 组件实现原理
Apache Omid TSO 组件实现原理作用独立进程,处理全局事务之间的并发冲突。
流程TSOChannelHandler#channelRead -> AbstractRequestProcessor -> PersistenceProcessorHandler
总体流程123456789thread1 TSOChannelHandler#channelRead AbstractRequestProcessor#timestampRequest 接收 client 请求,创建 RequestEvent 并 publishthread2 AbstractRequestProcessor#onEvent 处理 RequestEvent 请求 AbstractRequestProcessor#handleRequest PersistenceProcessorImpl#addTimestampToBatch 创建 PersistEvent,当 batch 满了发送事件thread3 PersistenceP ...
Apache Omid Timestamp Oracle 组件实现原理
Omid Timestamp Oracle 组件实现原理作用生成全局单调递增的时间戳,支持获取操作和崩溃恢复。
功能1234567891011121314151617181920212223241.生成全局单调递增的时间戳(支持崩溃恢复) api next 返回下一个时间戳 getLast 返回最后一个分配的时间戳(当前时间戳) 实现方式 TimestampOracleImpl 单调递增的时间戳 在分配时间戳时,如果当前的最大时间戳已经用完,它会触发一个后台任务来更新最大时间戳 next: 分配下一个时间戳。如果当前的最大时间戳已经用完,它会等待后台任务分配新的时间戳 WorldClockOracleImpl 基于世界时间(System.timestamp)生成全局单调递增的时间戳2.存储时间戳 存储方式 in memory ...