oracle锁的理解

这里给定表结构为

   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;




转载于:https://www.cnblogs.com/liaomin416100569/p/9331248.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值