开始聊聊恶心的“锁”-- 3.Oracle DML表级锁概念
Posted InDataBase
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了开始聊聊恶心的“锁”-- 3.Oracle DML表级锁概念相关的知识,希望对你有一定的参考价值。
恶心的图又又来了
行锁有0,6
表锁有 0,1,2,3,4,5,6
表级锁
再来一张图,直接给你整迷糊
这张表是锁与锁之间的兼容关系。
YES表示模式间是兼容的,NO表示不兼容。
因为0号锁其实就是没有锁,所以上图没有列出0号锁。
咱们对表级锁对比之间的故事,进行逐一的分析,并对锁与锁之间的兼容性说明。
⊙ 0号锁代码
◎ 通道号:0号(闲逛通道)
◎ 代码名称:NONE
◎ 目的:闲逛
◎ 资源竞争:不跟其他顾客竞争任何并发资源
◎ ORACLE产生条件:纯粹的SELECT语句
⊙ 1号锁代码
◎ 通道号:1号(残疾人孕妇幼儿闲逛通道)
◎ 代码名称:NULL
◎ 目的:只是闲逛,如果店被拆除,需要得到通知
◎ 资源竞争:不跟其他顾客竞争任何并发资源,但是这个顾客有权知道这个店以后的动态。
◎ ORACLE产生条件:在SQL生成执行计划时,由ORACLE内部产生的。
1号锁不能阻止DDL,但是有通告功能。
⊙ 2号锁代码
◎ 通道号:2号(预购通道)
◎ 代码名称:SS(RS)
◎ 目的:有意图买东西的人,但现在只是先来查看下货是不是值得我买,所以要打开柜台。它只是一个SELECT动作。
◎ 资源竞争:如果有通过2号入口进店的人,则0,1,2,3,4,5号通道都可以进人,但6号通道不允许进人
◎ ORACLE产生条件:
LOCK TABLE table IN ROW SHARE MODE;
2号锁是仅仅和6号锁冲突。也就是说不同Session可以都取得同一表的2号锁,不冲突。
⊙ 3号锁代码
◎ 通道号:3号(购买通道)
◎ 代码名称:SX(RX)
◎ 目的:购买东西的人,所以要打开柜台。
◎ 资源竞争:如果有通过3号入口进店的人,0,1,2,3号通道都可以进人,但4,5,6号通道不允许进人。
◎ ORACLE产生条件:
1.隐式产生表级锁,是由ORACLE自动加锁。比如,insert、update、delete、for update,隐式产生一个SX表级锁
2.显式产生表级锁,LOCK TABLE table IN ROW EXCLUSIVE MODE;
小结:
1、由dml(insert、update、delete、forupdate)产生的表锁一定会产生行锁。
2、lock table in xxx mode产生的表锁不产生行锁
以下的4,5,6号表级锁,都是要显式使用LOCK TABLE语句触发的,不是DML语句产生的。
⊙ 4号锁代码
◎ 通道号:4号(非买通道)
◎ 代码名称:S
◎ 目的:想让店停止销售,只允许顾客闲逛或者有企图买商品的人先查验货,绝不允许柜台里的商品有任何变化。这叫共享锁,也叫只读锁。
◎ 资源竞争:如果有通过4号入口进店的人,则0,1,2,4号通道都可以进人,但3,5,6号通道不允许进人。
◎ ORACLE产生条件:
LOCK TABLE table IN SHARE MODE;
不同Session可以都取得同一表的4号锁,不冲突。
⊙ 5号锁代码
◎ 通道号:5号(非买通道)
◎ 代码名称:SSX(SRX)
◎ 目的:与4号锁一样。这叫共享行排他锁。
◎ 资源竞争:如果有通过4号入口进店的人,则0,1,2号通道都可以进人,但3,4,5,6号通道不允许进人。
◎ ORACLE产生条件:
LOCK TABLE table IN SHARE ROW EXCLUSIVE MODE;
不同于4号锁,不同Session中不能取得同一表的5号锁。
⊙ 6号锁代码
◎ 通道号:6号(非买通道)
◎ 代码名称:X
◎ 目的:这锁是最高级别的表级锁,它也存在于行级锁。
◎ 资源竞争:如果有通过6号入口进店的人,则0,1号通道都可以进人,但2,3,4,5,6号通道不允许进人。
◎ ORACLE产生条件:
LOCK TABLE table IN EXCLUSIVE MODE;
6号通道只能一个人进。
现在多少可以对Oracle表级锁有所认识了吧?
下次做一个实验,让你清楚一点了解共享锁之间的兼容关系。
翻翻历史,温故知新
以上是关于开始聊聊恶心的“锁”-- 3.Oracle DML表级锁概念的主要内容,如果未能解决你的问题,请参考以下文章
mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析。
(转)mysql 中的 latch锁和Tlock(事务锁), DML加锁规则,以及死锁分析
Java——聊聊JUC中的锁(synchronized & Lock & ReentrantLock)