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

  • 相关阅读:
    反射
    java 验证码识别
    Spring boot + mybatis + orcale
    JVM内存模型及垃圾回收的研究总结
    Java的Array和ArrayList
    Java中最常见的十道面试题
    session和cookie
    Hibernate的load()和get()区别
    ajax跨域获取网站json数据
    对于Spring的IOc和DI的理解
  • 原文地址:https://www.cnblogs.com/OliverQin/p/12634807.html
Copyright © 2011-2022 走看看