oracle锁

来源:互联网 发布:c语言标准库函数时间 编辑:程序博客网 时间:2024/05/29 09:59
一、ANSI/ISO事务的隔离级别指的是,一个事务对数据库的修改与另外一个事务的隔离程度
1.两个并发事务T1和T2在访问相同的行,可能存在的三种问题
a.幻像读取---T1通过where条件进行查询返回的行,T2插入了新的纪录,正好满足T1的where的条件,这时T1再次查询
看到了T2新插入的值,对于T1来说就像变魔术一样
b.不可重复读取---T1读取了1行,这时T2修改了T1读取的纪录,当T1再次读取的时候发现数据不一样了,这个称为
不可重复读
    c.脏读---T1更新了1条纪录的内容但是并没有进行提交,T2读取更新后的行,然后T1执行了回滚,T2所读取的行就无效了
    
2.为了处理上述问题,sql标准定义了几种事务隔离级别,按照隔离性级别从低到高依次为
a. READ UNCOMMITTED :幻像读、不可重复读和脏读都允许
b. READ COMMITTED   :允许幻像读和不可重复读,但是不允许脏读
c. REPEATABLE READ  :允许幻像读,但是不允许不可重复读和脏读
d. SERIALIZABLE     :幻像读、不可重复读和脏读都不允许
二、oracle支持READ COMMITTED和SERIALIZABLE两种事务的隔离级别,不支持其他2种,oracle默认的隔离级别是READ COMMITTED,这里其实由于undo的作用不会出现脏读
三、事务的隔离级别可以使用 set transaction 语句设置
    set transaction isolation level serializable;
四、锁模式
  1.排他锁:简记为X锁,T1对数据对象A加上X锁,则只允许T1读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T1释放A上的锁。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁
  2.共享锁:共享锁又称为读锁(Share lock,简记为S锁),若事务T1对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T1释放A上的S锁。
五、oracle锁分类
    分为三大类
    1.dml锁,主要是保护数据,主要有表锁和行锁,防止并发的ddl和dml操作导致的破坏
    分为2类
    a.Row lock(TX)
     行上的锁,insert、update、delete、merge、select ... for update,和别的数据库需要单独的在内存中存在一个锁列表不同,oracle是通过在数据块
     头部包含行锁的信息的
     V$TRANSACTION视图列出了活动的事务
    b.Table locks(TM)
     表上的锁,insert、update、delete、merge、select ... for update,lock table语句
     这里又分为几类
     i.Row Share (RS):行共享锁
       也叫做subshare table lock (SS),表示事务在表上的锁主要是锁定表中的行,行共享锁是表锁中最不受限制
       的模式,为表提供了最高的并发度
     ii.Row Exclusive Table Lock (RX)
       也叫做subexclusive table lock (SX),一般指的是更新表行的时候持有的锁或者select for update语句,它允许其他事务
       select,insert,update,delete或同时在同一个表上进行行锁,因此sx允许多个事务获取同一个表的SX和subshare表锁
     iii.Share Table Lock (S)
       一个表级共享锁,允许其他事务select(不是select ... for update),但是只有当前保持共享锁的事务才可以修改内容,又因为可以多个事务
       都在表上加共享锁,因此保持此锁不一定可以修改对应的内容
     iv.Share Row Exclusive Table Lock (SRX)
       也可以叫做share-subexclusive table lock (SSX),它比S锁更严格,同一时刻只能有一个事务请求到ssx锁,请到到共享锁后,允许其他事务进行查询,但是不可以进行
       更新
     v.Exclusive Table Lock (X)
       这个是最严格的锁,它禁止其他事务执行任何类型的dml语句或放置任何类型的表锁
    2.ddl锁,主要是保护对象的结构,这里的ddl是data dictionary (DDL) lock,不是Data Definition Language,
      从字面上看这个是数据字典锁,就是对数据对象进行加锁保护,ddl锁是oracle自动控制的,用户无法进行显示请求
      比如用户创建一个存储过程,oracle会自动在存储过程中定义的对象上加锁,主要是阻止在程序编译过程中这些对象被修改或删除
      a.Exclusive DDL Locks        
      b.Share DDL Locks  
      c.Breakable Parse Locks      
    3.system锁,主要是保护内部数据结构     
六、查看锁类型
1.我们执行下面的语句
  SQL> select * from dept for update;
    --查看这个会加什么锁
    SQL> select se.USERNAME,lo.type,decode(lo.lmode,0,'none',1,'null',2,'row-s(ss)',3,'row-x(sx)',4,'share',5,'s/row-x(ssx)',6,'exclusive',to_char(lo.lmode)) lmode from v$lock lo,v$session se where lo.sid=se.sid
    2  and se.username='SCOTT';
USERNAME                       TY LMODE
------------------------------ -- ----------------------------------------
SCOTT                          TX exclusive
SCOTT                          AE share
SCOTT                          TM row-x(sx)
--提一条TX表示的是事务锁也就是行锁,exclusive是排他锁,也就是行上的排他锁
--第二条AE表示的是编辑锁,share表示的时共享锁,也就是编辑共享锁
--第三条TM表示的是dml锁或对象锁也就是表锁,row-x(sx)表示的时行排他锁
这里可以通过v$lock_type来查看
其实在行上加的锁也就会自动升级到表上,一个事务如果在行上加了一个锁的话,那么这个事务也会请求在表上
增加这个行锁,因此tm类型的锁区分为行和表,这里也就是为什么insert、update、delete、merge、select ... for update
即会造成tx锁也会造成tm锁
0 0
原创粉丝点击