HBase上region操作append加了行锁为什么还要mvcc等待之前的操作完成?

Hbase region上在做修改操作时有两个关键的lock: updatesLock,rowlock.

updatesLock保证memstore的刷新和其上的修改不能同时发生,memstore刷新时加写锁,其它情况

加读锁.rowlock顾名思义就是操作那一行的lock.操作时先updatesLock上的写锁,然后是rowlock如

append操作代码如下(下面的代码来自于hbase0.96.1.1)

    try {
      rowLock = getRowLock(row);
      try {
        lock(this.updatesLock.readLock());
        // wait for all prior MVCC transactions to finish - while we hold the row lock
        // (so that we are guaranteed to see the latest state)
        mvcc.completeMemstoreInsert(mvcc.beginMemstoreInsert());
这里的mvcc引起了我的兴趣,因为这里mvcc还要等待之前的修改操作完成,为什么加了行锁还要等待?

找到这篇文章解释:HBase MVCC and built-in Atomic Operations

大概意思是https://issues.apache.org/jira/browse/HBASE-4528这里为了优化put操作,将rowlock的释

放放在了wal同步的前面,意思是行锁释放了wal日志还未写入,读操作的readpoint也可能没更新,然后像

append这种修改操作可能会看到同一份数据的老版本,操作数据时就会出错,所以这里需要等待其之前

的操作完成然后才能继续操作.这里其实需不需要等待前面操作完成分两种情况,像不带条件的put操作

这种冥等操作其实是不需要等待前面操作完成就可以进行的,而append,increment这种非冥等操作不

行.这也是为什么这里需要首先等待前面操作完成的原因.




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值