Oracle LOCK内部机制及最佳实践系列四深入分析mode 26 的TM锁相互间的互斥关系.docx
- 文档编号:30285831
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:15
- 大小:17.83KB
Oracle LOCK内部机制及最佳实践系列四深入分析mode 26 的TM锁相互间的互斥关系.docx
《Oracle LOCK内部机制及最佳实践系列四深入分析mode 26 的TM锁相互间的互斥关系.docx》由会员分享,可在线阅读,更多相关《Oracle LOCK内部机制及最佳实践系列四深入分析mode 26 的TM锁相互间的互斥关系.docx(15页珍藏版)》请在冰豆网上搜索。
OracleLOCK内部机制及最佳实践系列四深入分析mode26的TM锁相互间的互斥关系
深入分析mode2-6的TM锁相互间的互斥关系
Oracle TM锁的类型
锁模式
锁描述
含义
锁定表的SQL
0
None
1
Null
空,本模式是oracle预留模式
2
RowShare(RS)
又叫(SS)
行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。
其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存
Locktabletinrowsharemode;
3
RowExclusiveTableLock(RX)
又叫(SX)
行级排他锁,通常已经有事务在修改行或者select…forupdate 修改结果集。
允许其他事务对锁定的表进行select insert update delete 或 locktable 同时锁定一张表
Locktabletinrowexclusivemode;
4
ShareTableLock(S)
共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它
Locktabletinsharemode;
5
ShareRowExclusiveTableLock(SRX)
又叫SSX
共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改
Locktabletinsharerowexclusivemode;
6
ExclusiveTableLock(X)
排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表
一个表一般只能有一个6号锁
Locktabletinexclusivemode;
Oracle锁模式互斥关系图
锁模式
锁名称
允许级别
互斥级别
2
行级共享锁
2345
6
3
行级排他锁
23
456
4
共享锁
24
356
5
共享行级排他锁
2
3456
6
排他锁
23456
实验锁互斥
准备工作
LEO1@LEO1>selectdistinctsidfromv$mystat; LEO1用户的会话id=138
SID
----------------------------
138
LEO2@LEO1>selectdistinctsidfromv$mystat; LEO2用户的会话id=156
SID
----------------------------
156
LEO1@LEO1>createtablelock1(xintprimarykey); 创建lock1表,设置x列为主键
Tablecreated.
LEO1@LEO1>insertintolock1values
(1); 我们插入1
1rowcreated.
LEO1@LEO1>commit; 提交
Commitcomplete.
LEO1@LEO1>select*fromlock1; 现在只有一条记录,并且没有锁
X
----------------------------
1
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
norowsselected
行级共享锁 RowShare(RS) 2
LEO1@LEO1> locktablelock1inrowsharemode; 把lock1表设置为行级共享锁模式
Table(s)Locked.
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
------------------------------------------------------------------------------------------------------------------------------------
138 TM 73472 0 2 0 0
模式标识:
2
LEO1@LEO1>selectobject_namefromdba_objectswhereobject_id=73472; lock1表对象id为73472
OBJECT_NAME
----------------------------------------------------------------------------------------------------
LOCK1
LEO2@LEO1> insertintoleo1.lock1values
(2);
1rowcreated.
LEO2@LEO1>select*fromleo1.lock1;
X
----------
1
2
LEO2@LEO1> deletefromleo1.lock1wherex=1;
1rowdeleted.
LEO2@LEO1>select*fromleo1.lock1;
X
----------
2
LEO2@LEO1> updateleo1.lock1setx=10wherex=2;
1rowupdated.
LEO2@LEO1>select*fromleo1.lock1;
X
----------
10
LEO2@LEO1> select*fromleo1.lock1forupdate;
X
----------
10
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
-------------------------------------------------------------------------------------------------------------------------
138 TM 73472 0 2 0 0
156 TM 73472 0 3 0 0
156TX 524321 936 6 0 0
小结:
行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。
其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存。
行级排他锁 RowExclusiveTableLock(RX) 3
LEO1@LEO1> locktableleo1.lock1inrowexclusivemode; 把lock1表设置为行级排他锁
Table(s)Locked.
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
------------------------------------------------------------------------------------------------------------------------
138 TM 73472 0 3 0 0
模式标识:
3
3级锁是一个灵活性比较大的锁,insertdeleteupdate 都可以产生一个3级锁,也允许其他事务来修改锁定的表
LEO1@LEO1> select*fromleo1.lock1;
X
-----------------
10
20
30
40
50
会话27
LEO1@LEO1> updateleo1.lock1setx=100wherex=10;
1rowupdated.
LEO1@LEO1>select*fromleo1.lock1; 已经被修改了
X
------------------
20
30
40
50
100
会话156
LEO2@LEO1> insertintoleo1.lock1values(60); 也已经插入了,注意没有提交的事务对别人是不可见的
1rowcreated.
LEO2@LEO1>select*fromleo1.lock1;
X
-----------------
10
20
30
40
50
60
会话146
LEO2@LEO1> deletefromleo1.lock1wherex=20; 已经删除
1rowdeleted.
LEO2@LEO1>select*fromleo1.lock1;
X
--------------------
10
30
40
50
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
--------------------------------------------------------------------------------------------------------------------------
27 TM 73472 0 3 0 0
27 TX 327698 1144 6 0 0
138TM 73472 0 3 0 0
146 TM 73472 0 3 0 0
146 TX 196626 975 6 0 0
156 TM 73472 0 3 0 0
156 TX 262163 782 6 0 0
大家都是共存的,谁也没有阻塞谁,block列全部是0
小结:
行级排他锁,通常已经有事务在修改行或者select…forupdate 修改结果集。
允许其他事务对锁定的表进行select insert update delete 或 locktable 同时锁定一张表。
共享锁 ShareTableLock(S) 4
LEO1@LEO1>select*fromleo1.lock1; 还是有5条记录
X
-----------------
10
20
30
40
50
LEO1@LEO1> locktableleo1.lock1insharemode; 把lock1表设置为共享锁
Table(s)Locked.
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
-----------------------------------------------------------------------------------------------------------------------
138 TM 73472 0 4 0 0
模式标识:
4
4级锁禁止其他会话对锁定的表进行DML操作但可以select查询,还允许多个事物一起持有
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
------------------------------------------------------------------------------------------------------------------------
13TM 73472 0 0 4 0
27 TM 73472 0 0 3 0
138TM 73472 0 4 0 1
146 TM 73472 0 0 3 0
156 TM 73472 0 0 3 0
27146156 会话都已经被阻塞了,有的朋友会问4级锁可以和4级锁共存这里为什么不行呢。
呵呵因为有3级锁在捣乱,4级和3级是不能共存的,所以我们把所有的3级锁都释放就可以了,我们来看一下
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
------------------------------------------------------------------------------------------------------------------------
13 TM 73472 0 4 0 0
27 TM 73472 0 2 0 0
138 TM 73472 0 4 0 0
现在4级锁 2级锁都可以同时存在了
小结:
共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它。
共享行级排他锁 ShareRowExclusiveTableLock(SRX) 5
LEO1@LEO1> locktableleo1.lock1insharerowexclusivemode; 把lock1表设置为共享行级排他锁
Table(s)Locked.
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
-----------------------------------------------------------------------------------------------------------------------
138 TM 73472 0 5 0 0
模式标识:
5
LEO1@LEO1>selectobject_namefromdba_objectswhereobject_id=73472; 现在锁定的表就是lock1
OBJECT_NAME
--------------------------------------------------------------------------------
LOCK1
会话138
LEO1@LEO1>select*fromleo1.lock1; 现在表里有5条记录,我们看看其他会话能不能修改表
X
--------------------
10
20
30
40
50
会话156
LEO2@LEO1> insertintoleo1.lock1values(60); hang住了不能够前进说明被阻塞
会话27
LEO1@LEO1> updateleo1.lock1setx=100wherex=10; hang住了不能够前进说明被阻塞
会话146
LEO2@LEO1> deletefromleo1.lock1wherex=20; hang住了不能够前进说明被阻塞
那么select…forupdate 当然也会被阻塞的,我们来看看其他事务能不能查询呢!
会话23
LEO2@LEO1>select*fromleo1.lock1;
X
-------------------
10
20
30
40
50
LEO1@LEO1>selectsid,type,id1,id2,lmode,request,blockfromv$lockwheretypein('TM','TX')orderby1,2;
SIDTYPE ID1 ID2 LMODE REQUEST BLOCK
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Oracle LOCK内部机制及最佳实践系列四深入分析mode 26 的TM锁相互间的互斥关系 LOCK 内部 机制 最佳 实践 系列 深入 分析 mode TM 相互 关系
链接地址:https://www.bdocx.com/doc/30285831.html