Ch08-HBase 之 事务

Ch08-HBase 之 事务

November 19, 2020
Apache HBase
hbase

HBase 事务

1. 原子性 (Atomicity) #

HBase 数据会首先写入 WAL,再写入 Memstore。写入 Memstore 异常很容易可以回滚,因此保证写入/更新原子性只需要保证写入 WAL 的原子性即可。而 WAL 的格式如下。

<logseq#-for-entire-txn>:<WALEdit-for-entire-txn>
<logseq#-for-entire-txn>:<-1, 3, <Keyvalue-for-edit-c1>, <KeyValue-for-edit-c2>, <KeyValue-for-edit-c3>>

每个事务操作只会产生一个 WAL 条目,这样就保证了 WAL 的原子性。

2. 一致性 (Consistency) #

由原子性,隔离性,持久性共同保证。

3. 隔离性 (Isolation) #

隔离主要体现在多个操作相互影响导致结果不对,比如两个 update 线程同时修改一行数据,最后修改出来的数据结果完全错误;比如一个 write 线程写数据,还没有写完的时候,read 线程就来读取数据,结果读到的数据完全错误。

3.1 写写并发控制 #

在写入(或更新)之前先获取行锁,如果获取不到,说明已经有其他线程拿了该锁,就需要不断重试等待或者自旋等待,直至其他线程释放该锁。拿到锁之后开始写入数据,写入完成之后释放行锁即可。

3.2 读写并发控制 #

借助 MVCC(Mutil Version Concurrent Control) 机制。每个写(更新)事务分配一个 Region 级别自增的序列号,并且为每一个读请求分配一个已完成的最大写事务序列号。这样就保证了读操作读到的数据一定是写(更新)事务完成后的数据。

4. 持久性 (Durability) #

HBase 事务持久化可以理解为 WAL 持久化,目前实现了多种持久化策略:SKIP_WALASYNC_WALSYNC_WALFSYNC_WAL

5. 参考文献 #