Apache Omid Client 组件源码实现原理

Apache Omid Client 组件实现原理

作用

通过 TransactionManager 开启/提交/回滚事务,提供事务内快照隔离级别的读写操作。

使用

// 1.创建 transaction manager
TransactionManager 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);
Result tx2GetResult = txTable.get(tx2, tx2Get);
// 5.提交事务
tm.commit(tx0);

流程

开启事务

tso 申请开始时间戳
创建 hbase transaction 对象
    初始化 start timestamp 和 read timestamp 和 write timestamp

提交事务

1.调用 tso 逻辑
    1.1.写冲突检测
    1.2.分配 commit timestamp
    1.3.写入 OMID_COMMIT_TABLE
        start timestamp 为 key
        start timestamp + commit timstamp 为 value
设置事务状态 committed 和 commit timestamp
添加 shadow cell 到 MY_TX_TABLE
    遍历 write set,每一个 cell 对应一个 shadow cell
    创建 shadow cell
        timestamp 属性是 writeTimestamp,其实就是 startTimestamp
        value 是当前事务的 commitTimestamp
    更新 shadow cell 到测试表 MY_TX_TABLE
根据当前事务的 start timestamp 删除 commit table 记录

回滚事务

1.tso 判断发生写冲突 abort 当前事务
2.回滚当前事务 writeSet 里所有行的提交
    删除 write cells
    flush

事务内读操作

获取当前事务的 read timestamp(默认就是 start timestamp)
设置查询时间戳范围 0 ~ readTimestamp+1,只读取当前事务和事务启动之前的最新快照版本
添加 shadow cell 查询条件
过滤查询返回的快照结果
    构建 commitCache,存储 shadow cell 的 timestamp -> commit timestamp 映射
    遍历非 shadow cells
        判断当前 cell 是否在当前事务内
        判断当前 cell 是否在当前事务可以读取的快照内
            根据当前 cell 的 startTimestamp
                查找 shadow cell 的 commitCache
                查找 commitTable
                若查询不到 commitTimstamp,说明当前 cell 尚未提交
如果上面没找到,则查询之前的版本重复上面的流程进行查找
SnapshotIsolationExample 事务内读操作流程
tx0 已经提交;
tx1 开启事务后修改数据,但是没有提交;
tx2 开启事务后读取数据,按道理应该读取到 tx0 已经提交的版本数据;

tx0:
    startTimestamp = 1721780321605000000
    readTimestamp = 1721780321605000000
    writeTimestamp = 1721780321605000000
    commitTimestamp = 1721780325508000000

tx1:
    startTimestamp = 1721780328808000000
    readTimestamp = 1721780328808000000
    writeTimestamp = 1721780328808000000
    commitTimestamp = 0 // 尚未提交

tx2:
    startTimestamp = 1721780328825000000
    readTimestamp = 1721780328825000000
    writeTimestamp = 1721780328825000000
    commitTimestamp = 0 // 尚未提交

tx2 Get:
查询条件 
    timeRange=0~1721780328825000000+1

Get result:
// tx0 shadow cells
0 = {NoTagsKeyValue@5564} "EXAMPLE_ROW/MY_CF:\x00\xC2\x80MY_Q\xC2\x80/1721780321605000000/Put/vlen=8/seqid=0"
// tx1 update
1 = {NoTagsKeyValue@5565} "EXAMPLE_ROW/MY_CF:MY_Q/1721780328808000000/Put/vlen=4/seqid=0"

commitCache:
// tx0 的 shadow cell
{Long@5602} 1721780321605000000 -> {Long@5603} 1721780325508000000

snapshotFilter:
根据当前 cell 的 startTimestamp 查找 commitTimestamp
// (tx1的当前cell) EXAMPLE_ROW/MY_CF:MY_Q/1721780328808000000/Put/vlen=4/seqid=0 
判断当前cell有没有提交
    没有 snapshot commitCache
    commitTable 查询不到
    说明当前 tx1 cell 没有提交

----------------- 查询2
oldestCell:
// tx1 update
EXAMPLE_ROW/MY_CF:MY_Q/1721780328808000000/Put/vlen=4/seqid=0

tx2 Get:
查询历史快照,查询条件:
    timeRange=0~1721780328808000000 // tx1 的快照版本
    snapshotCount=2 // 查询两个历史版本

Get result:
// tx0 shadow cell
0 = {NoTagsKeyValue@5617} "EXAMPLE_ROW/MY_CF:\x00\xC2\x80MY_Q\xC2\x80/1721780321605000000/Put/vlen=8/seqid=0"
// other
1 = {NoTagsKeyValue@5618} "EXAMPLE_ROW/MY_CF:\x00\xC2\x80MY_Q\xC2\x80/1721731810073000000/Put/vlen=8/seqid=0"
// tx1 cell
2 = {NoTagsKeyValue@5619} "EXAMPLE_ROW/MY_CF:MY_Q/1721780321605000000/Put/vlen=10/seqid=0"
// other2
3 = {NoTagsKeyValue@5620} "EXAMPLE_ROW/MY_CF:MY_Q/1721731810501000000/Put/vlen=4/seqid=0"

commitCache:
{Long@5870} 1721731810073000000 -> {Long@5871} 1721731810450000000
// tx0 shadow cells
{Long@5872} 1721780321605000000 -> {Long@5873} 1721780325508000000

遍历 filter current cells:
// tx0
0 = {NoTagsKeyValue@5883} "EXAMPLE_ROW/MY_CF:MY_Q/1721780321605000000/Put/vlen=10/seqid=0"
// other
1 = {NoTagsKeyValue@5884} "EXAMPLE_ROW/MY_CF:MY_Q/1721731810501000000/Put/vlen=4/seqid=0"

snapshotFilter:
在 commitCache 里查询到了 1721780321605000000 对应有 commitTimestamp
说明 tx0 已经提交

keyValuesInSnapshot
返回 tx0 对应的 cell
// tx0
EXAMPLE_ROW/MY_CF:MY_Q/1721780321605000000/Put/vlen=10/seqid=0

事务内写操作

获取当前事务的 write timestamp
row 添加 write timestamp
    直接更新当前行记录
        比如 value=initialVal -> value=val1 
transaction.addWriteSetElement(cellId) 添加到 write set
addMutation
    rows 写入刷到 hbase

模块

omid-client
omid-hbase-client

Transaction

Transaction (org.apache.omid.transaction)
    AbstractTransaction (org.apache.omid.transaction)
        HBaseTransaction (org.apache.omid.transaction)

TransactionManager

TransactionManager (org.apache.omid.transaction)
    AbstractTransactionManager (org.apache.omid.transaction)
        HBaseTransactionManager (org.apache.omid.transaction)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
【项目资】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资、音视频、网站开发等各种技术项目的码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的码。 【项目质量】:所有码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资、音视频、网站开发等各种技术项目的码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的码。 【项目质量】:所有码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资、音视频、网站开发等各种技术项目的码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的码。 【项目质量】:所有码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资、音视频、网站开发等各种技术项目的码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的码。 【项目质量】:所有码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资】:包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资、音视频、网站开发等各种技术项目的码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、MATLAB、python、web、C#、EDA、proteus、RTOS等项目的码。 【项目质量】:所有码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或热衷于研究的人来说,可以在这些基础代码上进行修改和扩展,实现其他功能。 【沟通交流】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。鼓励下载和使用,并欢迎大家互相学习,共同进步。【项目资
大学生在线租房平台管理系统按照操作主体分为管理员和用户。管理员的功能包括报修管理、报修评价管理、字典管理、房东管理、房屋管理、房屋收藏管理、房屋留言管理、房屋租赁管理、租房论坛管理、公告信息管理、留言板管理、用户管理、管理员管理。用户的功能等。该系统采用了Mysql数据库,Java语言,Spring Boot框架等技术进行编程实现。 大学生在线租房平台管理系统可以提高大学生在线租房平台信息管理问题的解决效率,优化大学生在线租房平台信息处理流程,保证大学生在线租房平台信息数据的安全,它是一个非常可靠,非常安全的应用程序。 管理员权限操作的功能包括管理公告,管理大学生在线租房平台信息,包括房屋管理,培训管理,报修管理,薪资管理等,可以管理公告。 房屋管理界面,管理员在房屋管理界面中可以对界面中显示,可以对房屋信息的房屋状态进行查看,可以添加新的房屋信息等。报修管理界面,管理员在报修管理界面中查看报修种类信息,报修描述信息,新增报修信息等。公告管理界面,管理员在公告管理界面中新增公告,可以删除公告。公告类型管理界面,管理员在公告类型管理界面查看公告的工作状态,可以对公告的数据进行导出,可以添加新公告的信息,可以编辑公告信息,删除公告信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

FlyingZCC

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

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

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

打赏作者

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

抵扣说明:

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

余额充值