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  

               

  • 相关阅读:
    2017ccpc全国邀请赛(湖南湘潭) E. Partial Sum
    Codeforces Round #412 C. Success Rate (rated, Div. 2, base on VK Cup 2017 Round 3)
    2017 中国大学生程序设计竞赛 女生专场 Building Shops (hdu6024)
    51nod 1084 矩阵取数问题 V2
    Power收集
    红色的幻想乡
    Koishi Loves Segments
    Wood Processing
    整数对
    Room and Moor
  • 原文地址:https://www.cnblogs.com/hehe520/p/6330712.html
Copyright © 2011-2022 走看看