为了进行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