Tendis存储版 锁的实现

意向锁

意向锁解决的问题

对资源的进行并发控制管理。

Tendis存储版 意向锁的实现

Tendis存储版 意向锁保留了 IS/IX/S/X 四种锁状态。其冲突矩阵为:

锁模块_实现_2020-12-08-15-32-39

使用方式:

  1. 对一个节点加IX/X锁时,必须先(递归)获取其父节点的IX锁。
  2. 对一个节点加IS/S锁时,必须先(递归)获取其父节点的IS锁。

锁模块_实现_2020-12-08-15-32-39

Tendisplus 在 DML 操作的时候对 KVStore 上 X 锁,因为已经锁住了 KVStore,不会再有其他 key 可能操作。 在创建 kvstore 的时候统一使用 TXN_PES

Keys 级锁并发

Tendis存储版 对 Keys 的操作采用 悲观锁的方式。 在 Key 操作的过程中会一直持有该锁, 其他操作该锁 的 Session 需要等待锁的释放。

  • 多 Keys 命令的加锁

对于 HMSET SUNION 这样的多 Keys 的命令, 如果不限制 keys 的加锁顺序, 就有可能造成死锁。 因此为了避免死锁, 我们规定了 多 keys 的加锁顺序:

  1. 首先按照 KvStore ID 从小到大的顺序, 依次对 KVStore 上锁;
  2. 然后按照 Slot 从小到大的顺序, 依次对 Slot 上锁;
  3. 最后按照 keys 的字典序进行上锁;

RocksDB 悲观/乐观锁

关闭 悲观锁和乐观锁 在 Tendis存储版 实现悲观锁, getDbWithKeyLock 层实现悲观锁。另外在 RocksDB 的 TransactionDB 事务中不会有加锁失败的情形。