ORACLE主要有三大类的锁,分别是:
⊙ DML锁
⊙ DDL锁
⊙ 内部锁或LATCH
它们涉及的对象会有所不同
DML就是我们的DELETE,UPDATE,INSERT语句,它操作的是表,视图等可见的SCHEMA对象。
DDL语句是ALTER TABLE,CREATE TABLE等语句,同样对象是表,视图,存储过程等,也是可见的SCHEMA对象。
这些对象如果是共享的话,就涉及到资源竞争。所以必须要用锁来进行限制资源的访问,这个锁我们叫LATCH。
LATCH没咋研究过,主要说说DML和DDL锁。
DML锁
DML锁是用来控制多个用户并行访问的数据确保一致性。
它确保在某一事务期间修改的数据,不能让另一个用户进行修改。
DML锁还可以确保如果被修改表的事务还没有结束的话,不允许在表上做DDL。
问:你做一个UPDATE语句,在表上有DML锁,那自己能去做DDL语句吗,比如DROP?这样可以吗?

答案是可以的,因为Oracle中的锁是用于控制并发的,在这个问题中,操作者都是同一个Session,不涉及并发,所以可以执行。
DML锁定按对象级别不同分:
⊙ 行级锁 TX(行对象上)
⊙ 表级锁 TM(表对象上)
TX是事务排他锁 Transaction eXclusive
TM是表级的管理锁 Table Manager
恶心的图来了:Oracle锁模式一览

PS:S是Share共享,X是Exclusive排他
之所以设计这么多种锁模式,目的是为了在不同场景下可以应对。
这个表格确实背不下来,但看着表格可以讲个故事,有助于理解。
故事开始:
有一个商店供人闲逛、购物等,客户依照自己的情况,通过不同的通道进入商店。
第1类人,闲逛的客人(走0号通道)
第2类人,闲逛的老弱病残孕客人(走1号通道)
第3类人,先拿回去试用,如果满意再确认付款的客人。(走2号通道)
第4类人,不闲逛,进店直接买的客人(走3号通道)
第5类人,大款,把整个商店包下来,供别人闲逛,预约,但不能买东西。(走4号通道)(多个大款同时存在是不冲突)
第6类人,心胸狭窄的大款,如果第6类人包下商店后,另一个第6类人不允许包了。(走5号通道)第6类人包下点后,仍然可以让1,2,3类人闲逛、预约,但依然不能买东西。
第7类人,大哥来了,只允许第1,2类人闲逛。(走6号通道)
商场会有很多柜台,你要买卖或者打算买卖时需要获得柜台锁。
只有拿到打开柜子的钥匙,才能打开柜子的锁,取出商品,卖给打算买或者立即买的客人。
开始类比
Oracle的表 => 商店
Oracle7类表级锁 => 商店的7个通道,由A0至A6的7个门卫把关
Oracle行级锁 => 柜台锁, 由营业员把关
先了解到这,下次具体聊聊行级锁、表级锁。
翻翻历史,温故知新




