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这种非冥等操作不
行.这也是为什么这里需要首先等待前面操作完成的原因.