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会自动检测死锁,并通过结束其中的一个事务来解决死锁

  • 相关阅读:
    SQL Server 2008 安装过程中遇到“性能计数器注册表配置单元一致性”检查失败 问题的解决方法
    备份还原工具—ghost
    太多的if,太多的痛苦
    C#中使用GUID
    WinForm开发中,将Excel文件导入到DataGridView中时,获取Excel中所有表格的名称。
    使用ASP调用C#写的COM+组件
    COM+ and the .NET Framework 虽是英文但比较全面
    在C#中使用COM+实现事务控制
    COM+ and the .NET Framework
    管理员ID过期,无人能够管理Domino服务器
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12634807.html
Copyright © 2011-2022 走看看