ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 关于oracle的锁

关于oracle的锁

原创 Linux操作系统 作者:gengzhizhen 时间:2009-03-10 16:11:59 0 删除 编辑

DDL锁用来保护表的物理结构,如列,索引
DML锁用来保护表中的数据

DML锁的模式(可以在v$lock的lmode列看到数字)
2
、行级共享锁(Row Shared,简称RS锁或SS锁)
其实是个表结构上的共享锁。第1个S代表表结构共享,第2个代表表里的部分数据共享。一般在子表上修改数据时,会在主表上加上这个锁。通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。
3、行级排他锁(Row Exclusive,简称RX锁或SX锁)
第一个S代表表结构共享锁,第二个X表示行的排他锁。当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。
4、共享锁(Share,简称S锁)
表示表结构和所有数据都上了一个共享锁。当对表创建索引时,在创建期间,表处于这种模式。通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。
5、共享行级排他锁(Share Row Exclusive,简称SRX锁)
就是SX+S锁。通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。
6、排他锁(Exclusive,简称X锁)
通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。一般在删除表时加上这种锁。
数字越大锁级别越高, 影响的操作越多。

锁的类型(在v$lock里的TYPE列里可以看到的值有)
注意:锁都是在实际操作之前发生的,所以锁本身不能预计到实际修改是否发生。
TM:表级锁,或者称为对象锁,是保护对象本身不被修改。只要在某一个对象上进行了操作,无论这个操作影响到多少行,都会有这个锁。
TX:事务级锁或者称为行级锁,是保护事务或行不被修改。只要事务开始或者行被修改(包括insert,update,delete)就会产生(也就是要到回滚段就会产生)。


锁的叠加
当前模式        允许模式
  RS RX S SRX X
RS  y y y y n(行级共享锁不能和排他锁叠加)
RX  y y n n n(行级排他锁只能和行级锁叠加)
S  y n y n n(共享锁不能和任何排他锁叠加)
SRX  y n n n n(共享行级排他锁只能和行级共享锁叠加)
X  n n n n n(排他锁不能和其他任何锁叠加)

各种锁产生的原因及常见的操作
1、手工加锁lock table xxx in [Row Share|Row eXclusive|eXclusive|Share|Share Row Exclusive] mode
2、update某些行,会产生一个RX(3级)的TM锁,如果实际发生了某些行的更新,则还会有一个X(6级)的TX锁。
3、select...for update和update一样。

相关视图以及视图的列
1、v$locked_object的locked_mode列表示在这个对象上锁的模式(用数字表示),session_id列表示拥有这个锁的会话,object_id表示被锁的对象。
2、v$lock的sid列表示拥有锁的会话,type列表示锁的类型(TM或TX,还有其他的),LMODE列表示锁的模式(用数字表示),request列表示正在申请的锁的类型,block列表示有另一个请求被这个锁阻塞了。
3、以sysdba运行catblock.sql(在rmdbs/admin下)后可以访问dba_locks,dba_blockers。从dba_locks的mode_held列可以看到锁的模式(文字表示)


关联表的锁
如果子表的外键上没有加索引,当在父表上删除记录时,会先在子表上申请获得Share锁,之后再在父表上申请Row   Exclusive锁。由于表级Share锁的封锁粒度较大,所以容易引起阻塞,从而造成性能问题。当在外键上建立索引后,在父表上删除数据将不再对子表上加Share锁只是加Row   Exclusive锁,封锁的粒度减小,引起阻塞的可能性也减小。

一些有趣的现象
1、如果update操作没有更新任何一行,就只会产生一个tm锁,但是不会有tx锁(即没有行级锁产生),否则还会有一个tx锁。
2、如果开始了一个空事务(即只是启动了事务但是没有任何DML操作),就会产生一个TX锁,但是没有TM锁(即没有修改任何对象,所以没有TM锁),v$locked_object里也不会有纪录。
3、但凡实际更新到某一行了,就会产生一个exclusive(6级)的TX锁,表明这一行完全不能动了(除了读)。
4、如果使用lock table xxx in xxx mode锁了一个表以后,只要commit或者rollback就可以解锁。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15142212/viewspace-566594/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-09

  • 博文量
    119
  • 访问量
    204731