这里给定表结构为
test(id number,name varchar2(20));
数据为:
insert into test values(1,'hello');
insert into test values(2,'world');
insert into test values(13,'test');
1.行级别的锁
在sqlplus的客户端1给某行添加锁
select * from test where id=1 for update
--此时在客户端1中 id为1的记录被锁定 其他的客户端假设为2 只能查询id为1的记录 删和改的操作会一直等待 等待当前客户端1释放锁(也就是提交和回滚事物) 客户端2 也不能获取行级别的锁 假设在客户端2中 也执行了select * from test where id=1 for update 那么会一直等待客户端1释放锁(也就是事物提交和回滚)
可以在客户端2指定为 select * from test where id=1 for update nowait 意思是客户端1已经锁定乐行 我这里不能锁定 我这里直接不等待 直接抛出异常退出
SQL> select * from test where id=1 for update nowait;
第 1 行出现错误:
ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源
也可以指定时间为等待多久 如果客户端1 一直不释放 到超过指定时间后 就不等待了 直接抛出异常退出
SQL> select * from test where id=1 for update wait 5;--这里5秒 对方还没释放 直接异常退出 作别的操作去 等会再来吧 呵呵
*
第 1 行出现错误:
ORA-30006: 资源已被占用; 执行操作时出现 WAIT 超时
1.表级别的锁
行共享:允许用户进行任何操作,禁止排他锁
lock table userinfo in row share mode;
行排他:允许用户进行任何操作,禁止共享锁
lock table userinfo in row exclusive mode;
共享锁:其他用户只能看,不能修改 【客户端1和客户端2 可同时添加共享锁 但是都不能修改】
lock table userinfo in share mode;
共享行排他:比共享锁有更多限制
lock table userinfo in share row exclusive mode;
排他锁:其他用户只能看,不能修改,不能加其他锁 【客户端1加了排它锁 客户端2 无法添加排它锁和其他任何锁】
lock table userinfo in exclusive mode;