本节记录锁和闩,如有错误请指正!
数据库是一个多用户并发处理的系统,在同一时间有可能多个用户访问数据库,如果要保证数据一致,那就必须要有一种机制来保证多个用户的操作不能互相影响,不能互相覆盖,因此我们能想到的最简单的方法就是串行化,一个用户修改数据后,另一个用户才能再继续修改数据,但是这样一来就大大降低了系统的并发性。在既要求串行化又要求并发性的时候,oracle数据库,就使用了锁定(lock)和闩锁(latch)来解决这个问题。锁定(lock)和闩锁(latch)相同点在于都用户实现串行化的资源,不同点在于闩锁是一个低级的轻量级的锁,获得和释放的速度快,锁定则可能持续时间很长。
在oracle中包含三大类锁:
DML锁:select,insert,update,delete,merge时对数据库加的锁,可能是行锁也可能是表锁
DDL锁:create,alter时对数据库加的锁,保护对象结构定义
内部锁和闩latch:oracle使用这些锁来保护其内部的数据结构
下面就分别来说一下
DML锁
dml锁用户确保同一时间只能有一个用户修改某一行并且其他用户不能删除表,这其中又包含了TX锁和TM锁。
TX锁,又是事物锁,每一次事物发起修改时就会得到这个锁,一直持续到此事物commit或者rollback。TX锁用作一种排队机制,一个会话得到锁,其他会话等待锁。锁定过程可分为1)找到要锁定的行的地址;2)到达这行;3)锁定这一行。
TM锁,用户确保在修改表的内容时,表结构不会改变
DDL锁
DDL锁是在DDL操作的时候会自动的给对象加上DDL锁,来保护这些对象不会被其他会话修改。这其中又包括排他DDL锁(Exclusive DDL lock),共享DDL锁(Share DDL lock),可中断解析锁(Breakable parse locks)。
排他DDL锁(Exclusive DDL lock):防止其他会话得到自己的DDL锁或TM锁。
共享DDL锁(Share DDL lock):保护所引用对象的结构,不会被其他会话修改,但是可以修改数据。
可中断解析锁(Breakable parse locks):允许一个对象向另外一个对象注册其依赖性。
闩latch
闩是轻量级的串行化设备,用于协调对共享数据结构,对象和文件的多用户访问。
下面为一些涉及到锁的视图和数据字典表
v$session,v$lock,v$lock_holders,v$transaction,dba_locks,dba_blockers,dba_waiters,dba_ddl_locks