过程锁不是关于并发性的!它们是为了对 HBase 实体(例如表或区域)提供过程读/写访问权限,这样就可以阻止其他过程在当前过程运行时修改 HBase 实体状态。

锁定是可选的,直到过程实现者,但如果过程正在操作实体,则所有转换都需要通过使用相同锁定方案的过程完成,否则会造成严重破坏。

两个 ProcedureExecutor Worker 线程实际上最终都会处理同一个 Procedure 实例。如果它发生了,那么线程就意味着运行一个过程的不同部分 - 那些没有相互标记的变化(这在程序框架概念'暂停'方面变得很尴尬。更多内容见下文)。

可选地,可以在程序的有效期内保持锁。例如,如果移动 Region,您可能希望拥有对 HBase Region 的独占访问权,直到 Region 完成(或失败)。这与{@link #holdLock(Object)}一起使用。如果{@link #holdLock(Object)}返回 true,则过程执行程序将调用 acquireLock()一次,之后不调用{@link #releaseLock(Object)},直到过程完成(通常,它调用每个周围的释放/获取)调用{@link #execute(Object)}。

锁也可以过程的生命;即一旦一个分配程序开始,我们就不希望另一个程序干涉该分配的区域。持有程序生命周期锁定的程序过程#holdLock 为 true。 AssignProcedure 执行此操作与拆分和移动一样(如果在区域移动的中间,您不希望它拆分)。

锁定可以终止程序。

一些锁具有层次结构。例如,获取区域锁定还会对其包含的表和命名空间进行(读取)锁定,以防止另一个过程获得对宿主表(或命名空间)的独占锁定。