oracle lock 1,Oracle LOCK内部机制及最佳实践系列(四)深入分析mode 2-6 的TM锁相互间的互斥关系...

本帖最后由 leonarding 于 2012-11-30 10:11 编辑

深入分析mode 2-6 的TM锁相互间的互斥关系

Oracle TM锁的类型锁模式锁描述含义锁定表的SQL

0None

1Null空,本模式是oracle预留模式

2Row Share(RS)

又叫(SS)行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存Lock table t in row share mode;

3Row Exclusive Table Lock(RX)

又叫(SX)行级排他锁,通常已经有事务在修改行或者select…for update修改结果集。允许其他事务对锁定的表进行select  insert  update  delete或lock table同时锁定一张表Lock table t in row exclusive mode;

4Share Table Lock(S)共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它Lock table t in share mode;

5Share Row Exclusive Table Lock(SRX)

又叫SSX共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改Lock table t in share row exclusive mode;

6Exclusive Table Lock (X)排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表

一个表一般只能有一个6号锁Lock table t in exclusive mode;

Oracle锁模式互斥关系图锁模式锁名称允许级别互斥级别

2行级共享锁2 3 4 56

3行级排他锁2 34 5 6

4共享锁2 43 5 6

5共享行级排他锁23 4 5 6

6排他锁2 3 4 5 6

实验锁互斥

准备工作

LEO1@LEO1> select distinct sid from v$mystat;           LEO1用户的会话id=138

SID

----------------------------

138

LEO2@LEO1> select distinct sid from v$mystat;           LEO2用户的会话id=156

SID

----------------------------

156

LEO1@LEO1> create table lock1 (x int primary key);创建lock1表,设置x列为主键

Table created.

LEO1@LEO1> insert into lock1 values(1);我们插入1

1 row created.

LEO1@LEO1> commit;提交

Commit complete.

LEO1@LEO1> select * from lock1;现在只有一条记录,并且没有锁

X

----------------------------

1

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

no rows selected

行级共享锁Row Share(RS)  2

LEO1@LEO1>lock table lock1 in row share mode;把lock1表设置为行级共享锁模式

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- ---------- ---------- --

138 TM              73472          020          0

模式标识:2

LEO1@LEO1> select object_name from dba_objects where object_id=73472;      lock1表对象id为73472

OBJECT_NAME

----------------------------------------------------------------------------------------------------

LOCK1

LEO2@LEO1>insert into leo1.lock1 values(2);

1 row created.

LEO2@LEO1> select * from leo1.lock1;

X

----------

1

2

LEO2@LEO1>delete from leo1.lock1 where x=1;

1 row deleted.

LEO2@LEO1> select * from leo1.lock1;

X

----------

2

LEO2@LEO1> update leo1.lock1 set x=10 where x=2;

1 row updated.

LEO2@LEO1> select * from leo1.lock1;

X

----------

10

LEO2@LEO1>select * from leo1.lock1 for update;

X

----------

10

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- -----------------

138TM              73472          020          0

156TM              73472          030          0

156 TX              524321     936          6          0          0

小结:行级共享锁,是限制最少的TM锁,可以提供最高程度的并发性。其他会话可以对锁定的表进行任何类型的DML操作,还可以与其他会话锁并存。

行级排他锁Row Exclusive Table Lock(RX)  3

LEO1@LEO1>lock table leo1.lock1 in row exclusive mode;把lock1表设置为行级排他锁

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- --------------------

138TM              73472          030          0

模式标识:3

3级锁是一个灵活性比较大的锁,insert delete update都可以产生一个3级锁,也允许其他事务来修改锁定的表

LEO1@LEO1>select * from leo1.lock1;

X

-----------------

10

20

30

40

50

会话27

LEO1@LEO1> update leo1.lock1 set x=100 where x=10;

1 row updated.

LEO1@LEO1> select * from leo1.lock1;已经被修改了

X

------------------

20

30

40

50

100

会话156

LEO2@LEO1> insert into leo1.lock1 values(60);也已经插入了,注意没有提交的事务对别人是不可见的

1 row created.

LEO2@LEO1> select * from leo1.lock1;

X

-----------------

10

20

30

40

50

60

会话146

LEO2@LEO1>delete from leo1.lock1 where x=20;已经删除

1 row deleted.

LEO2@LEO1> select * from leo1.lock1;

X

--------------------

10

30

40

50

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------- ---------- ---------------- ----------

27TM              73472          0          3          0          0

27TX              327698    1144          6          0          0

138 TM              73472          0          3          0          0

146TM              73472          0          3          0          0

146TX              196626      975          6          0          0

156TM              73472          0          3          0          0

156TX              262163      782          6          0          0

大家都是共存的,谁也没有阻塞谁,block列全部是0

小结:行级排他锁,通常已经有事务在修改行或者select…for update修改结果集。允许其他事务对锁定的表进行select  insert  update  delete或lock table同时锁定一张表。

共享锁Share Table Lock(S)  4

LEO1@LEO1> select * from leo1.lock1;还是有5条记录

X

-----------------

10

20

30

40

50

LEO1@LEO1>lock table leo1.lock1 in share mode;把lock1表设置为共享锁

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------- ---------- ---------- ---------- ---------- -----

138TM              73472          040          0

模式标识:4

4级锁禁止其他会话对锁定的表进行DML操作但可以select查询,还允许多个事物一起持有

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ------------------ ---------- ---------- ------------------ ----

13 TM             73472          0          0          4          0

27TM              73472          0          030

138 TM            73472          0          4          0          1

146TM            73472          0          030

156TM            73472          0          030

27 146 156会话都已经被阻塞了,有的朋友会问4级锁可以和4级锁共存这里为什么不行呢。呵呵因为有3级锁在捣乱,4级和3级是不能共存的,所以我们把所有的3级锁都释放就可以了,我们来看一下

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------------- ---------- ---------- ---------- ----------

13TM              73472          040          0

27TM              73472          020          0

138TM             73472          040          0

现在4级锁2级锁都可以同时存在了

小结:共享锁,其他事务可以查询锁定的表但不能修改,只允许当前事务修改,但可以多个事务持有它。

共享行级排他锁Share Row Exclusive Table Lock(SRX)  5

LEO1@LEO1>lock table leo1.lock1 in share row exclusive mode;把lock1表设置为共享行级排他锁

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ------------ ---------- ---------- ---------- ------------ -----

138 TM              73472          050          0

模式标识:5

LEO1@LEO1> select object_name from dba_objects where object_id=73472;现在锁定的表就是lock1

OBJECT_NAME

--------------------------------------------------------------------------------

LOCK1

会话138

LEO1@LEO1> select * from leo1.lock1;现在表里有5条记录,我们看看其他会话能不能修改表

X

--------------------

10

20

30

40

50

会话156

LEO2@LEO1>insert into leo1.lock1 values(60);hang住了不能够前进说明被阻塞

会话27

LEO1@LEO1>update leo1.lock1 set x=100 where x=10;hang住了不能够前进说明被阻塞

会话146

LEO2@LEO1>delete from leo1.lock1 where x=20;hang住了不能够前进说明被阻塞

那么select… for update当然也会被阻塞的,我们来看看其他事务能不能查询呢!

会话23

LEO2@LEO1> select * from leo1.lock1;

X

-------------------

10

20

30

40

50

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ------------------- ---------- ------------------- ---------- -

27TM               73472          0          030

138 TM              73472          050          1

146TM              73472          0          030

156TM              73472          0          030

会话23没有被阻塞可以正常查询耶,这也验证了我们的观点,读操作不会被任何事务阻塞,也不会加锁,27  146  156会话3个行级排他锁都在等待着138会话释放锁

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ----------

13TM              73472          020          0

138TM              73472          050          0

会话13的2级锁和会话138的5级锁可以共存符合我们的锁互斥关系

小结:共享行级排他锁,同一时间只允许一个事务持有和修改锁定的表,其他事务可以查询但不能修改。

排他锁Exclusive Table Lock (X)  6

LEO1@LEO1> lock table leo1.lock1 in exclusive mode;把lock1表设置为排他锁,等级最高的锁

Table(s) Locked.

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- -------------- ---------- ---------- -------------- ----------

138 TM              73472          0         6          0          0

模式标识:6

会话156

LEO2@LEO1>insert into leo1.lock1 values(60);

会话27

LEO1@LEO1>update leo1.lock1 set x=100 where x=10;

会话146

LEO2@LEO1>delete from leo1.lock1 where x=20;

会话13

LEO2@LEO1> lock table leo1.lock1 in row share mode;测试锁互斥

LEO1@LEO1> select sid,type,id1,id2,lmode,request,block from v$lock where type in ('TM','TX') order by 1,2;

SID TYPE              ID1        ID2      LMODE    REQUEST      BLOCK

---------- ---------- ---------- ---------- ---------- ---------- ---------------- ---------- ---------- ---------- ---------- -------

13TM              73472          0          0          2          0

27TM              73472          0          030

138 TM              73472          0          6          0          1

146TM              73472          0          030

156TM              73472          0          030

6级锁会阻塞除了自己外的所有会话的事务并且排斥其他的所有锁模式连2级锁都不行,是最高限制的TM锁,当然select还是没有问题的。

小结:排他锁,是限制最高的TM锁,禁止其他事务执行任何类型的DML语句或者锁表。一个表一般只能有一个6号锁。

Leonarding

2012.11.28天津&winter

分享技术~成就梦想

Blog

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值