南大通用GBase 8s数据库(gbase database)解决事务并发问题,锁机制用于协调并发访问,防止多个事务同时操作数据导致的数据不一致。
GBase 8s 三种基本的锁的类型
- 共享锁(S 锁):允许多读,禁止写,就是我们常说的读锁
允许多个事务同时读取资源,但禁止任何事务对资源进行修改,保证数据读取的一致性。 - 排他锁(X 锁):禁止读写,就是我们常说的写锁
一个事务独占资源,禁止其他任何事务读取或修改资源,保证数据修改的完整性。 - 提升锁(U 锁):修改意向,可升级
“预防性锁” ,表示事务有修改资源的意向,允许后续升级为排他锁,以保证修改操作的原子性。该锁的目的是避免“读后改”的死锁(S → X 升级死锁)
锁的兼容矩阵
| 请求锁/已有锁 | 无锁 | S 锁 | U 锁 | X 锁 |
|---|---|---|---|---|
| 请求 S 锁 | √ | √ | √ | × |
| 请求 U 锁 | √ | √ | × | × |
| 请求 X 锁 | √ | × | × | × |
GBase 8s 支持的锁的粒度
- 库级锁
- 表级锁:低并发,低开销
- 页面锁:并发性与开销的平衡
- 行级锁:高并发,高开销
- index-key 锁:索引键锁,锁定索引,通过对两个索引上锁,同时锁定了这两个索引之间的索引,锁定的是一个范围区间,它不会允许其他的事务对当前索引键这个范围内进行修改操作。
封锁粒度就说明的是一次加锁所覆盖的数据的范围大小,这其实是一个在并发能力和锁管理成本之间权衡的一个结果,如果锁的粒度太大,那么它的并发能力就会很差,容易阻塞无关的事务;如果锁的粒度太小,那么带来的结果就是虽然它的并发度会变高,但是锁的数量就会非常的大,带来的锁的管理的成本就会变高。