oracle锁

锁概念基础

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。

加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。

在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两 种基本的锁类型来对数据库的事务进行并发控制。


意向锁的类型  
由两种基本的锁类型(S锁、X锁),可以自然地派生出两种意向锁:  
意向共享锁(Intent Share Lock,简称IS锁):如果要对一个数据库对象加S锁,首先要对其上级结点加IS锁,表示它的后裔结点拟(意向)加S锁;  
意向排它锁(Intent Exclusive Lock,简称IX锁):如果要对一个数据库对象加X锁,首先要对其上级结点加IX锁,表示它的后裔结点拟(意向)加X锁。  
另外,基本的锁类型(S、X)与意向锁类型(IS、IX)之间还可以组合出新的锁类型,理论上可以组合出4种,即:S+IS,S+IX,X+IS,X+IX,但稍加分析不难看出,实际上只有S+IX有新的意义,其它三种组合都没有使锁的强度得到提高(即:S+IS=S,X+IS=X,X+IX=X,这里的"="指锁的强度相同)。所谓锁的强度是指对其它锁的排斥程度。  
这样我们又可以引入一种新的锁的类型:  
共享意向排它锁(Shared Intent Exclusive Lock,简称SIX锁):如果对一个数据库对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。例如:事务对某个表加SIX锁,则表示该事务要读整个表(所以要对该表加S锁),同时会更新个别行(所以要对该表加IX锁)。  
这样数据库对象上所加的锁类型就可能有5种:即S、X、IS、IX、SIX。  
具有意向锁的多粒度封锁方法中任意事务T要对一个数据库对象加锁,必须先对它的上层结点加意向锁。申请封锁时应按自上而下的次序进行;释放封锁时则应按自下而上的次序进行;具有意向锁的多粒度封锁方法提高了系统的并发度,减少了加锁和解锁的开销。


Oracle锁

Oracle的DML锁(数据锁)正是采用了上面提到的多粒度封锁方法,其行级锁虽然只有一种(即X锁),但其TM锁(表级锁)类型共有5种,分别称为共享锁(S锁)、排它锁(X锁)、行级共享锁(RS锁)、行级排它锁(RX锁)、共享行级排它锁(SRX锁),与上面提到的S、X、IS、IX、SIX相对应。


保护元数据---->TM锁(表级锁)

保护数据 ------>TX锁(事务锁)


   在对数据进行修改的时候就会产生DML锁,一个事务会产生两把锁,一个是行级别的TX锁,一个是表级别的表级共享锁TM
   select sid,TYPE,ID1,ID2,LMODE,REQUEST,CTIME from v$lock; --发起dml,使用语句查询



1.TX锁(行级锁、事务锁 Transaction

许多对Oracle不太了解的技术人员可能会以为每一个TX锁代表一条被封锁的数据行,其实不然。TX的本义是Transaction(事务),当一个事务第一次执行数据更改(Insert、Update、Delete)或使用SELECT… FOR UPDATE语句进行查询时,它即获得一个TX(事务)锁,直至该事务结束(执行COMMIT或ROLLBACK操作)时,该锁才被释放。所以,一个TX锁,可以对应多个被该事务锁定的数据行(在我们用的时候多是启动一个事务,然后SELECT… FOR UPDATE NOWAIT)。   
在Oracle的每行数据上,都有一个标志位来表示该行数据是否被锁定,数据行上的锁标志一旦被置位,就表明该行数据被加X锁,Oracle在数据行上没有S锁。

TX锁用作一种排队机制:请求锁的事务会排队,等待目前持有锁的事务执行,然后得到数据。

2.TM锁(表级锁table-level lock):

TM的作用是对并发的 DDL 操作进行访问控制,例如防止在 DML 语句执行期间相关的表被移除。当用户对表执行 DDL 或 DML 操作时,将获取一个此表的表级锁。表级锁不会影响其他并发的 DML 操作。对于分区表来说,表级锁既可以针对整个表,也可以只针对某个分区。

当用户执行以下 DML 语句对表进行修改:INSERT,UPDATE,DELETE,及 SELECT ... FOR UPDATE,或执行 LOCK TABLE 语句时,事务将获取一个表级锁。当一个未提交的事务拥有某个表上的锁时,此表就无法被修改定义或被移除。


锁模式    锁描述   解释  SQL操作 

0   none 
1   NULL   空   Select 
2   SS(Row-S)   行级共享锁,其他对象只能查询这些数据行   、Lock for update、Lock row share 
3   SX(Row-X)   行级排它锁,在提交前不允许做DML操作   Insert、Update、Delete、Lock row share 
4   S(Share)   共享锁   Create index、Lock share 
5   SSX(S/Row-X)   共享行级排它锁   Lock share row exclusive 

6   X(Exclusive)   排它锁   Alter table、Drop table、Drop index、Truncate table 、Lock exclusive

解释SSX锁 也叫SRX锁 

一张表,要查询了,就在上面加了共享锁;在上面进行DML操作了,没有提交的情况下,就加上了共享行级排它锁

SQL> select * from tv ;
                                     T1
---------------------------------------
                                      1


SQL> lock table tv in share mode;
Table(s) locked

SQL> update tv set t1=t1+2;
1 row updated

SQL> select  sid,type,lmode from v$lock where type='TM';
       SID TYPE      LMODE
---------- ---- ----------
       116 TM            5



具体TM锁的测试请参考 http://blog.csdn.net/renfengjun/article/details/18810967

介绍一些操作

 

lock table tun2_tab in ROW SHARE mode ;

lmode=2

lock table tun2_tab in ROW EXCLUSIVE mode ;

lmode=3

lock table tun2_tab in SHARE MODE ;

lmode=4

lock table tun2_tab in SHARE ROW EXCLUSIVE MODE ;

lmode=5

lock table tun2_tab in EXCLUSIVE MODE ;

lmode=6

TM锁相互间的互斥示例 

 

RS|SS

RX|SX

S

SRX|SSX

X

RS|SS

×

RX|SX

×

×

×

S

×

×

×

SRX|SSX

×

×

×

×

X

×

×

×

×

×

 查找锁和解锁

1.下面的语句用来查询哪些对象被锁:
select object_name,machine,s.sid,s.serial#
from v$locked_object l,dba_objects o ,v$session s
where l.object_id = o.object_id and l.session_id=s.sid;
2.下面的语句用来杀死一个进程:
alter system kill session '24,111'; (其中24,111分别是上面查询出的sid,serial#)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值