zoukankan      html  css  js  c++  java
  • 【Oracle11g】07_锁

    1.锁的概念

    • 锁是数据库用来控制共享资源并发访问的机制。
    • 锁用于保护正在被修改的数据。
    • 直到提交或回滚了事务之后,其他用户才可以更新数据。

    2.锁的类型

    2.1 行级锁

    行级锁是一种排他锁,防止其他事务修改此行。
    在使用以下语句时,Oracle会自动应用行级锁:

    INSERT
    UPDATE
    DELETE
    

    SELECT … FOR UPDATE
    SELECT … FOR UPDATE语句允许用户一次锁定多条记录进行更新
    使用COMMIT或ROLLBACK语句释放锁

    以下是模拟锁的案例:
    打开2个cmd窗口,一个使用system用户登录,一个使用scott用户登录,登录后先在scott用户上修改表emp的数据

     update emp set sal=100 where empno=7369;
    

    在不提交与不回滚的状态下,继续在system用户下执行该语句。则结果如下:system窗口处于等待状态。

    此时,我们可以查看锁

    -- 使用sys用户登录,通过v$lock动态视图查到锁,然后找到锁对应的ID1列,找到对应的ID,例如:ID1列的值为73196
     select * from v$lock;
    
    -- 查看ID1值为73196的对象,通过表dba_objects可以看到表名,类型等信息
    select * from dba_objects a where a.object_id='73196'
    
    

    2.1.1 select ... for update语法

    在给表使用select for update语句时,不允许删除和修改该表的记录,但是可以插入新的记录
    语法:

    SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT];
    

    wait n参数表示等待n秒后,能锁则锁,不能锁则返回错误信息
    nowait参数表示不等待,我现在能锁则锁,不能锁则直接返回错误

    2.2 表级锁

    表级锁的意思就是将整个表都锁定,不允许其他用户对表访问。
    使用命令显示地锁定表,应用表级锁的语法是:

    LOCK TABLE table_name IN mode MODE;
    

    • 行共享 (ROW SHARE) – 禁止排他锁定表
    • 行排他(ROW EXCLUSIVE) – 禁止使用排他锁和共享锁
    • 共享锁(SHARE)
      • 锁定表,仅允许其他用户查询表中的行
      • 禁止其他用户插入、更新和删除行
      • 多个用户可以同时在同一个表上应用此锁
    • 共享行排他(SHARE ROW EXCLUSIVE) – 比共享锁更多的限制,禁止使用共享锁及更高的锁
    • 排他(EXCLUSIVE) – 限制最强的表锁,仅允许其他用户查询该表的行。禁止修改和锁定表

    2.3 死锁

    当两个事务相互等待对方释放资源时,就会形成死锁
    Oracle会自动检测死锁,并通过结束其中的一个事务来解决死锁

  • 相关阅读:
    初认识AngularJS
    (imcomplete) UVa 10127 Ones
    UVa 10061 How many zero's and how many digits?
    UVa 11728 Alternate Task
    UVa 11490 Just Another Problem
    UVa 10673 Play with Floor and Ceil
    JSON对象和字符串的收发(JS客户端用typeof()进行判断非常重要)
    HTML.ActionLink 和 Url.Action 的区别
    EASYUI TREE得到当前节点数据的GETDATA方法
    jqueery easyui tree把已选中的节点数据拼成json或者数组(非常重要)
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12634807.html
Copyright © 2011-2022 走看看