ORACLE 中的lock 机制


为了进行LOCK的探究,我建立了一个测试表 test ,结构和测试数据如下:
SQL> select * from test;

        ID NAME
---------- ----------
         6 yoxi
         2 robinson
         2 tttt
         3 david
         4 jason
         5 lucy
         1 test

已选择7行。

row share(行共享)如果对某个表执行了row share锁定,那么,其他的SESSION就不能针对该表执行排他(exclusive)锁定,但是可以执行其他任意锁定。也就是说某个session对该表执行了row share锁定,那么其他session除了drop 命令不能执行,其他dml都可执行。
session 1中:
SQL> lock table test in row share mode;
表已锁定。
session 2中:
SQL> lock table test in row share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in share mode;
表已锁定。
SQL> commit;
提交完成
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
           *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> update test set id=10;
已更新7行。
SQL> rollback;
回退已完成。
SQL> drop table test;
drop table test
           *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源 //其实drop table 命令会对表进行exclusive 锁定
row exclusive(行排他) 当执行insert,update,delete就会获得一个行排他锁,这个锁具有row share的所有特征,如果一个session获得了一个row exclusive 锁,那么另外的session 就不能对该表进行exclusive锁定,也不能对该表进行share锁定,可以对该表进行dml操作,但是不能drop;

session  1中
SQL> lock table test in row exclusive mode;
表已锁定。
session 2中:
SQL> lock table test in row share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in share mode nowait;
lock table test in share mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

share(共享锁) 当一个session对某个表进行了share锁定,那么其他的session就不能以exclusive ,row exclusive 方式锁定该表,也就是说,如果不能row exclusive的话,就不能进行insert,update ,delete 操作,不能获得exclusive锁定就不能进行drop操作。
session 1中
SQL> lock table test in share mode;
表已锁定。
session 2中
SQL> lock table test in row share mode;
表已锁定。
SQL> lock table test in row exclusive mode nowait;
lock table test in row exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in share mode;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

exclusive(排它锁)当执行drop命令,就会产生一个排它锁。顾名思义,只要某个session 对某个表进行了exclusive 锁定,那么其他session就不能对该表进行任何锁定。
session 1中
SQL> lock table test in exclusive mode;
表已锁定。
session 2中
SQL> lock table test in row share mode nowait;
lock table test in row share mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
其他锁定就不用测试了,因为 row share都不能获得 其他锁定就更不能获得了

share row exclusive(共享行排他)如果某个session获得了一个share row exclusive锁定,那么其他session就只能获得对该表的row share锁定,也就是说其他session不能对该表进行 insert ,update,delete,drop 操作.row share 锁定 除了防止drop 一无是处 ....
session 1中
SQL> lock table test in share row exclusive mode;
表已锁定。
session 2中
SQL> lock table test in row share mode nowait;
表已锁定。
SQL> commit;
提交完成。
SQL> lock table test in row exclusive mode nowait;
lock table test in row exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in share mode nowait;
lock table test in share mode nowait
         *
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
SQL> lock table test in exclusive mode nowait;
lock table test in exclusive mode nowait
*
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源

总结一下:

1.如果一个table 被一个session锁定,无论什么锁定,另外的session就不能获得对于该表exclusive的锁定,也就是说不能删除该表,其实很容易相同,别人在用那个表,你去把表给删除了,肯定是不允许的.

2.如果能够对某个表进行row exclusive 锁定,那么肯定可以执行dml操作

3.可以这样理解share锁,顾名思义,共享锁是用来共享的,既然是共享,所以其他用户只能查看,不能更改。

4.可以这样理解exclusive锁,顾名思义,排它锁就是独享的,其他用户只能查看,不能修改。

注意 :上面通过lock 命令的lock 只能获得 TM(表) lock

            而通过 update ,delete ,insert 产生的lock 有两种,一种是TM lock,一种是TX lock, tx lock 是事务锁的意思

            select........... for update 也会得到一个TX lock 以及一个 row exclusive lock  

           

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值