知识大全 oracle锁的管理practiced

Posted

篇首语:绳锯木断,水滴石穿。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 oracle锁的管理practiced相关的知识,希望对你有一定的参考价值。

  今天参考了一些文档 作了以下一点实验 记录了整个过程 留个记录吧

  一 插入时锁的情况

   打开一个命令行窗口 用sqlplus登陆到oracle

  c[oracle@qatest ~]$ sqlplus fortune/fortune

  SQL*Plus: Release Production on Sun May : :

  Copyright (c) Oracle   All Rights Reserved

  Oracle Database g Enterprise Edition Release Production

  With the Partitioning OLAP Data Mining and Real Application Testing options

   创建一个测试表

  SQL>

  SQL> create table test (a number a char( ));

  create table test (a number a char( ))

  SQL> desc test

  Name                                      Null?    Type

  

  A                                                  NUMBER

  A                                                  CHAR( )

   插入几条测试数据

  SQL> insert into test values ( );

   row created

  SQL> select * from test ;

  A A

  

  

  SQL> insert into test values ( );

   row created

  SQL> mit;

  SQL> select * from test ;

  A A

  

  

  

  SQL> insert into test values ( );

   row created

  SQL> insert into test values ( );

   row created

   用sys用户可以查看到当前的sid号码:

  SQL> select sid username from v$session where username= FORTUNE ;

  SID USERNAME

  

   FORTUNE

   用sys用户登进去查看当前sid所占有的锁及类型:(在没有mit之前所占有的锁)

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TX                   

   TM                   

  SQL> mit;

   mit之后再查一下sid为 的进行的锁的情况:mit之后就不占用锁了

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  no rows selected

   重新打开一个命令行窗口 使用fortune用户登入第二的进程

  [oracle@qatest ~]$ sqlplus fortune/fortune

  SQL*Plus: Release Production on Sun May : :

  Copyright (c) Oracle   All Rights Reserved

  Connected to:

  Oracle Database g Enterprise Edition Release Production

  With the Partitioning OLAP Data Mining and Real Application Testing options

  SQL>

  SQL>

   用sys用户可以看到这两个进行的SID号

  SQL> select sid username from v$session where username= FORTUNE ;

  SID USERNAME

  

   FORTUNE

   FORTUNE

   在第一个窗口执行以下插入: (SID 为 ) 不要mit

  SQL> insert into test values ( );

   row created

   在第二个窗口执行以下插入:(SID 为 ) 同样也不要mit:

  SQL>

  SQL> insert into test values ( );

   row created

   这时再用sys用户查看fortune 用户所占有的sid总共占有的锁及类型:(在没有mit之前所占有的锁)

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TX                   

   TM                   

   TX                   

   TM                   

   这时在窗口一执行mit:

  SQL> mit;

  Commit plete

   这时再用sys用户查看fortune 用户所占有的锁及类型:

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TX                   

   TM                   

  可以看到sid为 的锁已经释放了 只有sid 所占有的锁了

   这时在窗口二执行mit:

  SQL> mit;

  Commit plete

   这时再用sys用户查看fortune 用户所占有的锁及类型:

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  no rows selected

  SQL> select * from test ;

  A A

  

  

  

  

  

  

  

  发现没有锁了 记录已经添加成功了

  二 Update 时锁的占用情况:

   在窗口一执行一个update:(不要mit)

  SQL> update test set a = where a = ;

   row updated

   同样在窗口二也执行一个update 更新同一行数据: (不要mit)

  SQL> update test set a = where a = ;

   row updated

  这时可以看到这个窗口已经停止反应了

   这时用sys用户查看fortune用户的锁情况 如下:

  SQL>  select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TM                   

   TX                   

   TM                   

   TX                   

  发现 的TX类型的锁里 request 为 是在等待另外一个锁

   这时用sys查看一下sid 对应的系统事件:

  SQL> select sid event from v$session where sid= ;

  SID EVENT

  

   enq: TX row lock contention

  可以看到 在等一个row lock的结束

   这时在窗口一执行mit:

  SQL> mit;

  Commit plete

   这时在窗口二的update就有反应了

   这时再用sys查看一下sid 对应的系统事件:

  SQL> select sid event from v$session where sid= ;

  SID EVENT

  

   SQL*Net message from client

  在这可以看到等待结束了

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TX                   

   TM                   

  以上可以看到 sid 占有的锁已经都释放了

  SQL> select * from test ;

  A A

  

  

  

  

  

  

  

  在这也可以看到a = 这一行的A 值已经被更新为 了

   这时再到窗口二执行mit

  SQL> mit;

  Commit plete

  再看锁的情况 发现fortune用户的锁都已经释放了

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  no rows selected

  SQL> select * from test ;

  A A

  

  

  

  

  

  

  

  在这也可以看到a = 这一行的A 值已经被更新为 了

  三 锁的解除

   在窗口一上执行以下更新:

  SQL> update test set a = where a = ;

   row updated

   在窗口二执行以下更新:

  SQL> update test set a = where a = ;

  这时和上面一样 可以看到窗口二hang住了 没反应了 我等了半小时还是一样

   这时用sys用户来查询一下fortune的锁情况:

  SQL> select sid type lmode request from v$lock where sid in( ) order by sid;

  SID TY      LMODE    REQUEST

  

   TM                   

   TX                   

   TM                   

   TX                   

  可以看到和前面的结果是一样的 sid 在等 的一个锁释放掉

   使用以下语句来查一下锁的情况:

  SQL> select A sid b serial#

  decode(A type

   MR Media Recovery

   RT Redo Thread

   UN User Name

   TX Transaction

   TM DML

   UL PL/SQL User Lock

   DX Distributed Xaction

   CF Control File

   IS Instance State

   FS File Set

   IR Instance Recovery

   ST Disk Space Transaction

   TS Temp Segment

   IV Library Cache Invalida tion

   LS Log Start or Switch

   RW Row Wait

   SQ Sequence Number

   TE Extend Table

   TT Temp Table

   Unknown ) LockType

  c object_name

   b username

   b osuser

  decode(a lmode    None

   Null

   Row S

   Row X

   Share

   S/Row X

   Exclusive Unknown ) LockMode

  B MACHINE D SPID b PROGRAM

  from v$lock a v$session b all_objects c V$PROCESS D

  where a sid=b sid and a type in ( TM TX )

  and c object_id=a id

  AND B PADDR=D ADDR

   order by username

  ;

  SID    SERIAL# LOCKTYPE      OBJECT_NAME        LOCKMODE  MACHINE    SPID         PROGRAM

      

            DML           TEST         Row X     qatest             sqlplus@qatest (TNS V V )

           DML           TEST         Row X     qatest             sqlplus@qatest (TNS V V )

  或者用以下语句也可以:

  SQL> select   sid serial#   from   v$session   User_Info;

  SID    SERIAL#

  

           

          

          

           

            

            

         

          

            

            

            

  SID    SERIAL#

  

            

            

            

            

            

            

            

            

   用以下语句来结束窗口一的锁session

  SQL> alter system kill session ;

  System altered

  这时到窗口二可以看到窗口有反应了 update成功了(但还没有mit )

   这时如果在窗口一执行mit 可以看到以下报错

  SQL> mit;

  mit

  *

  ERROR at line :

  ORA : your session has been killed

   这时到窗口二执行mit

  SQL> mit;

  Commit plete

  SQL> select * from test ;

  A A

  

  

  

  

  

  

  

cha138/Article/program/Oracle/201311/18483

相关参考

知识大全 查找 Oracle 用户锁的DLL SQL

查找Oracle用户锁的DLLSQL  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  查找Orac

知识大全 解析Oracle多粒度锁的验证步骤

解析Oracle多粒度锁的验证步骤  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  创建测试表  

知识大全 我对ORACLE数据锁的一点体会

我对ORACLE数据锁的一点体会  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我对文章中意向锁

知识大全 Oracle数据库锁的常用类型有哪些

Oracle数据库锁的常用类型有哪些  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此文章主要是

知识大全 Oracle数据库查找被锁以及解锁的解决办法

Oracle数据库查找被锁以及解锁的解决办法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  or

知识大全 Spring i18n的better practice

Springi18n的betterpractice  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!因

知识大全 oracle加锁

  加锁是为了防止一些操作而进行的比如说共享锁可以防止别的事务加上排他锁如果多个事物对同一张表都加上共享锁的话也就都不能修改了可以进行读操作如果只有一个事物加上共享锁是可以修改的  而排他锁呢则是不能

知识大全 哪里有卖课桌锁的

哪里有卖课桌锁的?急!小卖店呵呵一元二次不等式,急是不是(a-2)x的平方是不是+4求以下文字的翻译急!!YuanlongpingisacademicianofChineseacademyofengi

锁的由来

远在3000多年前,我国就有了锁。不过,最早的锁没有机关,它并不能把门锁锁住,只是做成老虎等凶恶动物的形状,想借以把小偷吓走,只好说是一种象征性的锁。据说鲁班是第一个给锁装上机关的人。从出土文物及文字

知识大全 Sql中游标和加锁的问题分析与解答

Sql中游标和加锁的问题分析与解答  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!    <%