类似于HBase中的事务



我有一个小问题——我不明白如何在HBase中创建事务(或类似事务)。例如,有两个表,我想在第一个表中插入值,在第二个表中更新值。我发现HTable有方法:

void batch(List<Row> actions, Object[] results)
//Method that does a batch call on Deletes, Gets and Puts.

但是它只适用于一个表。在谷歌上,我找到了MultiAction类:

用于操作(即Get、Delete或Put)的容器,这些操作按regionName。拟用于HConnectionManager.processBatch()

这是我要找的吗?如果是,那我就不明白什么是区域了。谢谢你的帮助。

HBase不支持事务处理。虽然在单个表上有原子性,但如果需要更新多个表,就没有事务之类的东西。事务指的是缩写为ACID的4件事。简而言之

  • 原子性-事务中的更改一起发生("全部或没有")。
  • 一致性-状态应该保持有效
  • 隔离-事务外的操作无法看到半更改(中间不一致状态)
  • 耐久性-更改应该持续

你需要修改HBase代码来获得隔离但如果你可以放松这个要求你可以实现一个事务协调器它大致会做如下事情

  • 将事务中需要做的事情保存在一个特殊的表中(事务日志)
  • 执行第一次更改
  • 执行第二次更改
  • 验证步骤已完成,并将事务标记为完成
  • 恢复时,转到事务日志并完成/回滚更改

请注意,由于您没有隔离,有时回滚不是一个选项,因此您需要实现补偿逻辑(还要查看saga模式)

有一些项目旨在提供HBase之上的事务层,比如我参与的Omid。

最新更新