数据库的锁
关键字:
KingbaseES、锁、表级锁、行级锁、页级锁、人大金仓、KingbaseES
表锁、行锁、页锁
按锁的范围(粒度)分类, 可以分为表级锁、行级锁和页级锁。
只用到表锁,不会有死锁的问题,锁的开销也很小,但是相应的并发能力很差。锁的粒度变小了,并发能力变强,但是相应的锁的开销变大,很有可能出现死锁。
- 表锁
表级锁加锁对象是表,这使得加锁范围太大,导致并发并不高,于是人们提出了行级锁的概念,但行级锁与表级锁之间会产生冲突,这时需要一种机制来描述行级锁与表级锁之间的关系,有了意向锁的概念,这时又加了两种锁,即意向共享锁(Row Share) 和意向排他锁(Row Exclusive),由于意向锁之间不会产生冲突,因为他们是“有意”做,还没真做;而且意向排它锁相互之间也不会产生冲突,于是又需要更严格一些的锁,这样就产生了Share Update Exclusive,Share Row Exclusive可以看成Share与Row Exclusive,不会自动请求这个锁模式,也就是目前没有使用这种锁。
- 行锁
特定行上的行级锁是在行被更新的时候自动请求的(或者被删除时或标记为更新)。 锁一直保持到事务提交或者回滚。行级锁不影响对数据的查询;它们只阻塞对同一行的写入。 要在不修改某行的前提下请求在该行的行级锁,用 SELECT FOR UPDATE 选取该行。请注意一旦我们请求了特定的行级锁,那么该事务就可以多次对该行进行更新而不用担心冲突。
- 页锁
除了表级别的和行级别的锁以外, 页面级别的共享/排他销也用于控制对共享缓冲池中表页面的读/写访问。这些锁在抓取或者更新一行后马上被释放。应用程序员通常不需要关心页级锁,在这里提到它们只是为了完整。