oracle锁的理解

来源:互联网 发布:企业数据标准化 编辑:程序博客网 时间:2024/06/05 07:38

这里给定表结构为

   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;




0 0
原创粉丝点击