zoukankan      html  css  js  c++  java
  • 简单演示 Oracle 数据库并发导致行级锁

    本文内容

    • 软件环境
    • 简单演示 Oracle 数据库并发导致行级锁

    本文简单演示并发导致的行级锁。并发是两个以上的用户对同样的数据进行修改(包括插入、删除和修改)。锁的产生是因为并发。没有并发,就没有锁。并发的产生是因为系统需要,系统需要是因为用户需要。

    软件环境


    • Windows 2003 Server
    • Oracle 11g Release 1 (11.1)

    简单演示 Oracle 数据库并发导致行级锁


            首先,打开一个会话 session 1,执行如下操作:

    SQL> select distinct sid from V$mystat;
     
           SID
    ----------
           118
     
    SQL> create table t (x int primary key);
     
    表已创建。
     
    SQL> insert into t values(1);
     
    已创建 1 行。
     
    SQL> update t set x=10 where x=1;
     
    已更新 1 行。
     
    SQL>

            先查看本次会话的 SID,然后创建一个表 t,只有一个名为 x 的字段,且该字段为主键,插入一条数据,并更新该数据。

            接下来,打开另一个会话 session 2:

    SQL> select distinct sid from V$mystat;
     
           SID
    ----------
           137
     
    SQL> update t set x=10 where x=1;

            此时,该会话被“卡”在这里不动。只是光标一直在闪……因为,session 2 被 session 1 阻塞。

            现在,查看锁定视图 V$LOCK。

    SQL> select sid,type,id1,id2,lmode,request,block
      2  from v$lock where sid in (118,137)
      3  order by sid;
     
           SID TYPE         ID1        ID2      LMODE    REQUEST      BLOCK
    ---------- ----- ---------- ---------- ---------- ---------- ----------
           118 TM        128105          0          3          0          0
           118 AE            99          0          4          0          0
           118 TX        262174      34335          6          0          1
           137 TM        128105          0          3          0          0
           137 AE            99          0          4          0          0
           137 TX        262174      34335          0          6          0
     
    已选择6行。
     
    SQL>

            说明:“TYPE”列表示锁的类型;“LMODE”列表示锁的模式;“ID1”和“ID2”列是锁的相关信息。“REQUEST”列是正在什么锁。

            SID=118 是第一个会话,SID=137 是第二个会话。第三行,第一个会话 BLOCK=1 表示这个会话正在阻塞其他会话,LMODE=6 表示锁的模式,即行级排他锁。第六行,第二个会话 REQUEST=6 表示当前会话正在等待一个 LMODE=6 的锁。注意,第三行和第六行的 ID1 和 ID2 列完全相同。因为它们指向统一资源,只不过一个是资源的拥有者(SID=118),一个是资源的等待者(SID=137)。

            通过这个视图,很容易发现所在——故障定位(trouble shooting)。会话 2 之所以被“卡”住,是因为会话 1 还没提交,而在这张表上,又恰好有要求列值唯一性约束。

            通过 SID 号,查看视图 V$SESSION 就可以确定用户信息。

    SQL> select machine from v$session where sid in (118,137);
     
    MACHINE
    ----------------------------------------------------------------
    NUODE\LN
    NUODE\LN
     
    SQL>

            因为,两个会话是同一台机器,所以名字一样。

  • 相关阅读:
    S5PV210 NAND Flash
    S5PV210串口
    S5PV210初始化系统时钟
    每日英语:Dishing the Dirt on Hand-Washing Guidelines
    每日英语:Vender Assault Shines Ugly Light on China's Urban Enforcers
    每日英语:The Perils Of Giving Advice
    每日英语:China Targets Big Pharma
    每日英语:Asia Has World's Biggest Pay Gap, Study Finds
    每日英语:Now on Taobao: Outsourced Care for Grandma
    每日英语:The Upside of Favoritism
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2956371.html
Copyright © 2011-2022 走看看