zoukankan      html  css  js  c++  java
  • 【Oracle】锁

    Oracle所有锁的分配和管理都是数据库管理系统自动完成的,不需要用户进行干预。

    v$lock表说明

    字段

    描述

    ADDR Address of lock state object
    KADDR Address of lock
    SID 会话的sid,可以和v$session 关联
    TYPE 所获得的或等待的锁类型,取值如下:
    ①Tx --事务
    ②TM --表锁或DML
    ③MR --介质恢复
    ④ST --磁盘空间事务
    ID1 根据TYPE不同而有所不同
    对于TM 锁
    ID1表示被锁定表的object_id 可以和dba_objects视图关联取得具体表信息
    对于TX 锁

    ID1以十进制数值表示该事务所占用的回滚段号和事务槽slot number号,其组形式:
    0xRRRRSSSS,RRRR=RBS/UNDO NUMBER,SSSS=SLOT NUMBER

    ID2 根据TYPE不同而有所不同
    对于TM 锁
    ID2 值为0
    对于TX 锁
    ID2 以十进制数值表示环绕wrap的次数,即事务槽被重用的次数
    LMODE
    • 0:无
    • 1:空
    • 2:行共享(XS)
    • 3:行独占(RX)
    • 4:共享(S)
    • 5:共享行独占(SRX)
    • 6:独占(X)
    REQUEST 大于0时,表示当前会话被阻塞,其它会话占有改锁的模式
    TIME
    • 已持有或者等待锁的时间
    BLOCK
    • 是否阻塞其他会话锁申请 1:阻塞 0:不阻塞

    若LMODE含有一个不是0或1的数值,则表明进程已经获得一个锁。若REQUEST列含有一个不是0或者1的数值,则表明进程正在等待一个锁,若LMODE列含有的数值全部是0,则表明进程正在等待一个锁。

    监控锁

    查看所信息

    SELECT B.SID,C.USERNAME,C.TERMINAL,B.ID2,B.TYPE,B.LMODE,B.REQUEST
    FROM 
    DBA_OBJECTS A,V$LOCK B,V$SESSION C
    WHERE A.OBJECT_ID(+)=B.ID1
    AND B.SID=C.SID
    AND C.USERNAME IS NOT NULL
    ORDER BY B.SID,B.ID2

    以下是在SQL*Plus中运行结果

    image

    set echo off:显示start启动的脚本中的每个sql命令,缺省为on

    set pagesize 60:输出每页行数,缺省为24,为了避免分页,可设定为0。

    column SID format 999 heading "SessionID":格式化SID列数字显示并且列名为SessionID

    column USERNAME format A8:字段长度格式化为8 (Trunc为截取的意思)

    format的格式元素

    元素符号 说明 例子
    An 为varchar类型的列的列内容设置宽度,如果内容超过指定的宽度,则内容自动换行 A10
    9 设置number列的现实格式 999999
    $ 浮动的货币符号 $99
    L 本地的货币符号 L99
    . 小数点位置 9999.9
    , 千位分隔符 9,999

    锁的分类

    描述 加锁的方法
    行共享锁RS 对数据表定义行共享锁后,如果事务A获得,那么A事务可以进行并发查询、插入、删除及加锁,但不能以排他的方式存取该数据表 lock table xx in row share mode
    行排他锁RX 对数据表定义了行排他锁后,如果被事务A获得,那么A事务对数据表中的行数据有排他权限,其他事物可以对统一数据表进行增删改查及加锁,但是不能使用以下3种方式加锁:
    ①行共享锁
    ②共享行排他锁
    ③行排他锁
    lock table xx in row exclusive mode
    共享锁S 对数据表定义共享锁后,如果事务被A获得,其他事务可以执行并发查询和加共享锁但不能修改表,也不能使用以下3种方式加锁:
    ①排他锁
    ②共享行排他锁
    ③行排他锁
    lock table xx in share mode
    共享行拍他锁SRX 对数据表定义共享行拍他锁后,如果事务被A获得,其他事务可以执行并发查询和对其他数据行加锁,但不能修改表,也不能使用以下4种方式加锁:
    ①排他锁
    ②共享行排他锁
    ③行排他锁
    ④共享锁
    lock table xx in share row exclusive mode
    排他锁 排他锁是最严格的锁。如果事务被A获得,A可以执行对数据库的读写操作,其他事务可以执行查询,但是不能插入和修改、删除操作 lock table xx in exclusive mode

    锁表案例

    打开2个SQL*Plus窗口,此处我把这两个窗口的名称叫做P1,P2,分别连接到同一个用户;

    在数据库中有表TMP005,结构与数据如下:

    TY
    A
    B
    C

    1.先在P1窗口删除值为A的记录

    image

    2.先在P2窗口删除值为B的记录

    image

    3.然后回到P1删除值为B的记录

    image

    4.接着回到P2删除值为A的记录

    image

    从上面2图我们可以初步发现,死锁已经形成了,接下来就是解锁

    解锁操作:https://www.cnblogs.com/OliverQin/p/9593239.html

  • 相关阅读:
    (1) C语言 基础1
    (5)数据契约
    hdu3592(差分约束) (线性)
    POJ3169 差分约束 线性
    BZOJ 3754 Tree之最小方差树 MST
    CodeForces788B 欧拉路
    【bzoj2152】聪聪可可 点分治
    POJ 1741 Tree【Tree,点分治】
    POJ3107 树的重心
    poj1655(dfs,树形dp,树的重心)(点分治基础)
  • 原文地址:https://www.cnblogs.com/OliverQin/p/9656473.html
Copyright © 2011-2022 走看看