开始聊聊恶心的“锁”-- 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)

Java——聊聊JUC中的锁(synchronized & Lock & ReentrantLock)

Java——聊聊JUC中的锁(synchronized & Lock & ReentrantLock)