zoukankan      html  css  js  c++  java
  • oracle锁

      oracle支持并发,而锁是实现并发的重要技术之一。oracle锁的类型可以通过v$lock_type查看,平时我们接触得最多是以下两种,表锁和行锁,也称为DML锁和事务锁。

    select * from v$lock_type where type in('TM','TX') 

      

      行锁只有一种,就是排它锁。

      表锁有以下5种:

        (1)RS行级共享锁(row share):其他对象只能查询这些数据行,sql操作有select for update、lock for update、lock row share;

        (2)RX行级排它锁(row exclusive):在提交前不允许做DML操作,sql操作有insert、update、delete、lock row share;

        (3)S共享锁(share):sql操作有create index、lock share;

        (4)SRX共享行级排它锁:sql操作有lock share row exclusive;

        (5)X排它锁:alter table、drop table、drop index、truncate table、look exclusive等DDL

      下表是在Oracle文档里里面列出的操作会对表加上什么类型的lock,以及该锁和其他类型的操作的兼容性。

      Table 13-3 Summary of Table Locks

    SQL StatementMode of Table LockLock Modes Permitted?
    RSRXSSRXX

    SELECT...FROM table...

    none

    Y

    Y

    Y

    Y

    Y

    INSERT INTO table...

    RX

    Y

    Y

    N

    N

    N

    UPDATE table ...

    RX

    Y*

    Y*

    N

    N

    N

    DELETE FROM table...

    RX

    Y*

    Y*

    N

    N

    N

    SELECT ... FROM tableFOR UPDATE OF ...

    RS

    Y*

    Y*

    Y*

    Y*

    N

    LOCK TABLE tableIN ROW SHARE MODE

    RS

    Y

    Y

    Y

    Y

    N

    LOCK TABLE tableIN ROW EXCLUSIVE MODE

    RX

    Y

    Y

    N

    N

    N

    LOCK TABLE tableIN SHARE MODE

    S

    Y

    N

    Y

    N

    N

    LOCK TABLE tableIN SHARE ROW EXCLUSIVE MODE

    SRX

    Y

    N

    N

    N

    N

    LOCK TABLE tableIN EXCLUSIVE MODE

    X

    N

    N

    N

    N

    N

      以下是常用的查询视图:

    select * from v$lock
    select * from v$transaction
    select * from v$session

      接下来我们看一个例子,首先session A对一个表的数据进行更新,然后不提交事务,接着B对这条数据进行删除。

    Session A
    
    update group_test set name='gdpu' where id =1
    
    Session B
    
    delete from group_test where id=1

      再打开一个Session C,输入:

    select * from v$lock where type in('TM','TX')

      

      由上图可以看出,Session A,B分为产生两个锁,id分为为731,389。对于sid为731的Session,产生了一个TM锁(LMODE=3,为行级排它锁RX)和TX锁,BLOCK=1表示阻塞其他操作修改这条记录。对于id为389的Session,同样产生了一个TM锁(LMODE=3)和TX锁(LMODE=0代表正在等待一个锁)。

       查看v$transaction,如下:可以看出ADDR中的值00000001E76AC910与v$lock中的ADDR值一样。

    select * from v$transaction

      

      查看v$session,如下:

    select * from v$session where sid in(389,731)

      

      有时候我们执行一条Sql的时候,发现一直处于执行状态(阻塞状态),这时候可以先通过v$transaction查看是不是有另外一个操作执行了DML操作,事务未提交,然后根据ADDR的值到v$lock中查出对应的SID,然后根据SID到v$session中查找相应的信息。执行kill操作,如下:

    alter system kill session '731,47206' immediate;

       参考网址:http://www.cnblogs.com/suredandan/archive/2012/09/20/2696124.html

  • 相关阅读:
    查找数据库表中重复的 Image 类型值
    C#中的引用传递和值传递。
    用JS解决Asp.net Mvc返回JsonResult中DateTime类型数据格式的问题
    根据业务自己设计的.NET工厂模式架构
    封装EF code first用存储过程的分页方法
    2013款MacBook Air装Windows7单系统
    js判断是否在微信浏览器中打开
    EF Code First连接现有数据库
    JS中for循序中延迟加载实现动态效果
    DIV+CSS左右两列自适应高度的方法
  • 原文地址:https://www.cnblogs.com/gdpuzxs/p/6924020.html
Copyright © 2011-2022 走看看