酷酷娱乐网

站内广告

一文搞懂Oracle 0 至 6 级锁(附案例详解)

时间:2020-09-02 10:12:01   作者:酷酷娱乐网   来源:www.kukuyl.com  
内容摘要:
原文链接:
https://mp.weixin.qq.com/s/b2nXJm1OhDjsRO_g5f9OCg (公众号更多最新......

原文链接: https://mp.weixin.qq.com/s/b2nXJm1OhDjsRO_g5f9OCg (公众号更多最新数据库技术文章,快来关注吧!)


11g Concepts中摘录的锁的信息

Table Locks (TM)

A table lock, also called a TM lock, is acquired by a transaction when a table is modified by an INSERT, UPDATE, DELETE, MERGE, SELECT with the FOR UPDATE clause, or LOCK TABLE statement. DML operations require table locks to reserve DML access to the table on behalf of a transaction and to prevent DDL operations that would conflict with the transaction.

当事务通过INSERT、UPDATE、DELETE、MERGE和FOR UPDATE对表进行修改时,就会获得一个表锁,也称为TM锁子句,或锁表语句。DML操作需要表锁来为事务保留对表的DML访问权限,并防止DDL与事务冲突的操作。
A table lock can be held in any of the following modes:

Row Share (RS)

This lock, also called a subshare table lock (SS), indicates that the transaction holding the lock on the table has locked rows in the table and intends to update them. A row share lock is the least restrictive mode of table lock, offering the highest degree of concurrency for a table.

这个锁,也称为子共享表锁(SS),表示持有表上锁的事务已锁定表中的行并打算锁定更新它们。行共享锁是表锁中限制最少的一种模式,它为表提供最高程度的并发性。

Row Exclusive Table Lock (RX)

This lock, also called a subexclusive table lock (SX), generally indicates that the transaction holding the lock has updated table rows or issued SELECT ... FOR UPDATE. An SX lock allows other transactions to query, insert, update, delete, or lock rows concurrently in the same table. Therefore, SX locks allow multiple transactions to obtain simultaneous SX and subshare table locks for the same table.

这个锁,也称为subexclusive table lock (SX),通常表示持有锁的事务已经更新了表行或发出了SELECT…FOR UPDATE。SX锁允许其他事务在同一表中同时查询、插入、更新、删除或锁定行。因此,SX锁允许多个事务为同一个表获取同步的SX和子共享表锁。

Share Table Lock (S)

A share table lock held by a transaction allows other transactions to query the table (without using SELECT ... FOR UPDATE), but updates are allowed only if a single transaction holds the share table lock. Because multiple transactions may hold a share table lock concurrently, holding this lock is not sufficient to ensure that a transaction can modify the table.

事务持有的共享表锁允许其他事务查询表(除了SELECT…FOR UPDATE),但只允许更新如果一个事务持有共享表锁。由于多个事务可能同时持有一个共享表锁,因此持有此锁不足以确保事务可以修改表。

Share Row Exclusive Table Lock (SRX)

This lock, also called a share-subexclusive table lock (SSX), is more restrictive than a share table lock. Only one transaction at a time can acquire an SSX lock on a given table. An SSX lock held by a transaction allows other transactions to query the table (except for SELECT ... FOR UPDATE) but not to update the table.

这个锁,也称为共享-subexclusive table锁(SSX),比共享表锁有更多的限制。一次只能获得一个事务SSX锁定给定的表。事务持有的SSX锁允许其他事务查询表(除了SELECT…FOR UPDATE),但不更新表。

Exclusive Table Lock (X)

This lock is the most restrictive, prohibiting other transactions from performing any type of DML statement or placing any type of lock on the table.

此锁是最严格的,禁止其他事务执行任何类型的DML语句或将任何类型的锁放在表上。
因为ORACLE要处理不同的 并发功能,一旦处理不了那么多并发,就需要排队,为保证排队的公平就会出现各种优先级,因此 衍生出很多锁模式,来支持不同业务层的并发需求。
在同一个session里面,你执行一个UPDATE语句,在表上有DML锁,那自己能去做DDL语句吗,比如DROP?

因为是 同一个session,所以不涉及并发,自己做一个update不提交,随后drop table也是可以的

行锁:0、6两类锁
表锁:0、1、2、3、4、5、6七类锁
0(none)
1(null)
2(RS)
3(RX)
4(S)
5(SRX)
6(X)
R是ROW行,S是SHARE共享,X是eXclusive排他,独占锁的意思

0:null 空
一般的SELECT,在表和行上都是0级锁

1:n ull 空 
1级锁有:Select有时会在v$locked_object出现。 

2:Row-S 行共享(RS):共享表锁,sub share  
2级锁有:Lock Row Share,create index online

>>表锁的情况下
locked_mode 2不影响后一个locked_mode 2、3、4、5的会话,如果后一个会话locked_mode为6,则后一个会话操作会提示ora-00054错误。 
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

>>行锁的情况下
locked_mode 2对应行锁0级锁,不影响其他会话。

3:Row-X 行独占(RX):用于行的修改,sub exclusive
3级锁有:Insert, Update, Delete, Select for update,Lock Row Exclusive

>>表锁的情况下
locked_mode 3不影响后一个locked_mode 3的会话,但如果后一个会话locked_mode为4,5,6,则后一个会话操作会提示ora-00054错误。 
ORA-00054: resource busy and acquire with NOWAIT specified or timeout expired

>>行锁的情况下
locked_mode 3的表锁对应行锁6级锁,两个会话对同一行则影响。

4:Share 共享锁(S):阻止其他DML操作,share
4级锁有:Create Index, Lock Share

5:S/Row-X 共享行独占(SRX):阻止其他事务操作,share/sub exclusive  
5级锁有:Lock Share Row Exclusive  
具体来讲有主外键约束时update/delete ... ; 可能会产生4,5的锁。 

6:exclusive 独占(X):独立访问使用,exclusive
6级锁有:Drop table, Drop Index, Alter table,Truncate table, Lock Exclusive

珠宝店类比

珠宝店可以给大家免费参观,可以让你预定,可以试用后觉得好再买,可以把店都买下来

第0类人,免费参观珠宝店的人

第1类人,免费参观珠宝店的老弱病残孕的客人

第2类人,预定了试用期,先买来几天,如果试用后觉得好再买

第3类人,直接到店里的目的就是立即购买

第4类人,把整个店的珠宝包下来,让别人参观,预定,但是不能买卖(这在ORACLE中叫只读锁,只允许别人读,也就是只允许第0,1,2类人来珠宝店,让别人只读方式的参观,不允许买卖,再来个第4类人,还是允许的,因为大家虽然都想包,但是大家的目的都是分享,而不是独占,所以是可以兼容的)

第5类人,它跟第4类人的区别只有一条,就是第5类人包下整个珠宝店后,另一个第5类人就不允许再包了(这在ORACLE中叫写锁定),也就是第5类人是单通道的,你在珠宝店里只能找到1个第5类人,不可能找出第2个第5类人,但是第5类人把珠宝店包下来后,仍然可以让第0,1,2类人参观,但不允许买卖

第6类人,它把整个珠宝店盘下来,不允许任何人有目的的参观,只允许免费参观,它是独占的,只允许0,1类人参观,其他人都不允许

--以上第2类人预定的,所以第3类跟6类人不兼容
--以上第3类人是要买珠宝的,所以第3类跟4,5,6类人都不兼容

把珠宝店当成表,那珠宝店里的珠宝柜子当成行
珠宝店,7种人对应7种模式,对应表的7种锁,0、1、2、3、4、5、6
柜子,打开或关闭2种状态对应2种模式,对应行的2种锁,0、6

珠宝店
(能不能同时进店,可以的)
表级锁相当于珠宝店大门锁,由门卫把关,表锁有 0,1,2,3,4,5,6对应7类人群,7类人群能出现其中几类人同时进店的情况,比如0、1、2、3类人同时进来了,或3类人同时进来好多人。

0级锁:就是没有锁,只有纯粹的select语句
0类人:免费参观,不跟其他顾客有任何竞争

1级锁:其实起不了锁定的作用,他就是有一个通知的功能,根本阻止不了DDL,类似把执行计划中的对象通知对象所属的会话
1类人:(老弱病残)免费参观,不跟其他顾客有任何竞争,但是这个顾客有权知道这个店以后的动态,比如是否拆了。
比如会话A执行select * from T,然后把执行计划保存到内存,为了保护执行计划是正确的,会话A要享受老弱病残孕幼的待遇,因为如果T表被别人删除了,那会话A生成的执行计划还有用吗?如果你不通知,A怎么知道这个表对象已经失效了,也就是有1号锁的对象,一旦被删除,它会通知拥有该对象的会话,这个对象删除了,请你重新再分析下你的SQL,1号锁是系统自动生成的

2级表锁:只跟X冲突,因为其他都是共享锁,RX,SRX虽然也有X,但是是行的X,表上还是共享的意思,2级锁在表级别和0-5级不冲突
2类人:有意图买珠宝的人,但现在只是先来查看下货是不是值得我买,所以要打开柜台,它只是一个SELECT动作。不会正面跟有免费参观、有买卖企图的顾客冲突。
2级表锁的产生方式
显式产生表级锁(LOCK TABLE table IN ROW SHARE MODE,显式产生一个RS表级锁)
注意, 显式产生表级锁只产生表级锁,不会级联产生行级锁,所以不会和其他会话产生行锁

3级锁:产生的原因(update、delete、select for update、显示锁表LOCK TABLE table IN ROW EXCLUSIVE MODE)
3类人:直接购买珠宝的人,所以要打开柜台

6号的X是整个表级的排它锁,显示锁表 LOCK TABLE table IN Exclusive MODE

珠宝柜子
(能不能同时打开同一个柜子,不能啊,没有这种概念)
行级锁相当于珠宝店柜台锁,由营业员把关,行锁有0、6两种对应柜台两种状态关闭、

>>打开
通常顾客如果进入珠宝店,跑到柜台前有哪几种目的?
>>参观
柜子状态是关闭:0号模式
只是以参观为目的的顾客(第0类人、第1类人),不存在资源竞争的问题,那还需要营业员拿锁出来打开柜台吗?不需要,因为没有资源竞争就不需要锁了。
0号模式的行级锁是因为0、1号的表级锁造成的,简单的select语句既是0级表级锁也是0级行级锁,也就是没锁

本文章url:https://www.kukuyl.com/new/3000097.html

相关文章

本栏最新更新

本栏推荐

阅读排行

CopyRight 2018 - 2020 http://www.kukuyl.com 酷酷娱乐网 All Rights Reserved .