Tendis存储版 锁的实现
意向锁
意向锁解决的问题
对资源的进行并发控制管理。
Tendis存储版 意向锁的实现
Tendis存储版
意向锁保留了 IS/IX/S/X 四种锁状态。其冲突矩阵为:
使用方式:
- 对一个节点加IX/X锁时,必须先(递归)获取其父节点的IX锁。
- 对一个节点加IS/S锁时,必须先(递归)获取其父节点的IS锁。
Tendisplus 在
DML
操作的时候对 KVStore 上 X 锁,因为已经锁住了 KVStore,不会再有其他 key 可能操作。 在创建 kvstore 的时候统一使用 TXN_PES 。
Keys 级锁并发
Tendis存储版
对 Keys 的操作采用 悲观锁的方式。 在 Key 操作的过程中会一直持有该锁, 其他操作该锁 的 Session 需要等待锁的释放。
- 多 Keys 命令的加锁
对于 HMSET SUNION 这样的多 Keys 的命令, 如果不限制 keys 的加锁顺序, 就有可能造成死锁。 因此为了避免死锁, 我们规定了 多 keys 的加锁顺序:
- 首先按照 KvStore ID 从小到大的顺序, 依次对 KVStore 上锁;
- 然后按照 Slot 从小到大的顺序, 依次对 Slot 上锁;
- 最后按照 keys 的字典序进行上锁;
RocksDB 悲观/乐观锁
关闭 悲观锁和乐观锁 在 Tendis存储版
实现悲观锁, getDbWithKeyLock 层实现悲观锁。另外在 RocksDB 的 TransactionDB 事务中不会有加锁失败的情形。