zoukankan      html  css  js  c++  java
  • 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  

               

  • 相关阅读:
    activiti 任务节点 处理人设置【转】
    activiti 中的签收与委托 操作
    [转] shiro简单配置
    Angular-ui/bootstarp modal 主控制器与模态框控制器传值
    angular之$on、$emit、$broadcast
    AngularJs动态添加元素和删除元素
    angular.element
    angularJs的工具方法
    AngularJS $watch 监听
    AngularJs 延时器、计时器
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330712.html
Copyright © 2011-2022 走看看