好,我在用中文啰嗦一遍:锁是一种机制,它用于管理对共享资源的并发访问。注意,我说的是“并发资源”而不是“数据库行”。oracle会在行级对表数据锁定,这固然不错,不过ORACLE也会在其他多个级别上使用锁,从而对多种不同的资源提供并发访问。例如执行一个存储过程中,过程本身会以某种模式锁定,以允许其他用户执行这个过程,但是不允许另外的用户以任何方式修改这个过程。数据库中使用锁是为了支持对共享资源进行并发访问,与此同时还能提供数据的完整性和一致性。在你执行SQL语句时,锁会以最低级别的使用来保证最大程度上的并发支持与最大程度上的数据安全支持,你不需要太关心锁的问题。但是oracle也允许你来手动加锁。
二、锁的类型
Oracle大体上主要的有3种类型的锁,DML锁、DDL锁、闩和内部锁,这三种锁有它们各自的使用场景、使用目的以及各自的针对性。
1)DML锁
1、row lock (TX锁)这是一个行级锁,主要用来防止两个事务对同一行的同时修改。TX锁用作为一种排队机制,使得其他会话来等待这个事务执行。行级别上只有这一种锁,当行上有这个锁时,就永远不会在有第二个这个锁。但是一个表上可以在多行上有多个这种锁。如果要在表上的某一行加这个tx锁,那么一定要在这个表上加一个表级锁。下来就来说说表级锁。
2、table lock(TM锁)
这是一个表级锁,当有DML操作insert,update,delete,select……for update,lock table时,将在表上加上TM锁,DML操作需要加上表级锁有两个目的:1)为该事务保留对该表的DML操作权限 2)防止有ddl操作改变表的结构。TM锁可以排斥DDL锁(DDL锁中的一种共享ddl锁可以与TM锁共存,但大多数DDL操作并不会用这种锁),这样DDL操作就无法进行(下面会讲到DDL锁)。但不会影响DML操作。table lock可以有以下几种模式:
2)DDL锁
在DDL操作中会自动为对象加DDL锁,从而保护这些对象不会被其他会话锁修改。例如,如果我执行了一个DDL操作 alter table t,表T上就会加一个排他DDL锁,这个排他DDL锁会防止其他会话得到这个表上的DDL锁和TM锁。
有三种类型的DDL锁
1、排他DDL锁(Exclusive DDL lock):这会防止其他会话得到它们自己的DDL锁或TM(DML)锁。这也表明了,在加上这种类型的DDL锁后,DDL操作期间可以查询一个表,但是无法以任何方式修改这个表的结构和数据。
2、共享DDL锁(Share DDL lock):这些锁会保护锁引用对象的结构,使之不被其他会话修改,但是允许修改数据。
3、可中断解析锁(Share DDL lock):这些锁允许一个对象(如共享池中缓存的一个查询计划)像另外某个对象注册依赖性。如果在被依赖的对象上执行DDL,ORACEL会查看已经对该对象注册了依赖性的对象列表,并使这些对象无效。因此,这些所是“可中断的”,它们不能防止DDL出现。举个例子:你的会话解析一条语句时,对于该语句引用的每一个对象都会加一个解析锁。加这些锁的目的是:如果以某种方式删除或修改了一个被引用的对象,可以将共享池中已解析的缓存语句置为无效(刷新输出)。
大多数DDL带有一个排他DDL锁。
3)闩和内部锁
先不讲啦!!!!!
三、手动锁定和用户锁定
1)手动锁定
1、通过一条SQL语句进行锁定,可使用的的SQL语句有select * from table for update/select * from table for update nowait/lock table emp in exclusive mode这三种方法。
简单来说一下这三种的不同之处,select * from table for update和select * from table for update nowait,可以通过使用where条件提供细粒度的锁定。nowait的涵义是“不用等待,立即返回”,当要请求的资源被其他资源占有 时,不会堵塞等待,而是立即返回,返回什么呢?返回一个如下的错误提示:
ERROR at line 1:
ORA-00054: resource busy and acquire with NOWAIT specified
lock table emp in XX mode这种方法对整张表进行加锁,实际中很少使用。
2)通过DBMS_LOCK创建自己的锁。
不讲啦!!
四、随机想到的一点补充
oracle不会在任何地方存储行级锁的列表,也就是说,不会为每一个被锁定的行维护一个表,那样开销就太大了。为什么会提出这个问题的。
我这里更新了4行数据,在这4行中都将有一个TX锁,如果我们来查询V$lock来查看,许多人都认为v$lock中会友4行,因为我们锁定了4行。但是不是这样的,如前所述,不存在行级锁的一个主列表。如果某个会话将EMP表中一行锁定,v$lock视图中就有对应这个会话的一行来指示这一个事实。如果一个会话锁定了EMP表中的数百万行,v$lock视图中对应这个会话还是只有一行。这个视图显示了各个会话有哪些队列锁。
对应上面更新的v$lock视图:
lock的深入探讨连接:
http://czmmiao.iteye.com/blog/1464559
ballontt
2012.11.28
----The End----
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27425054/viewspace-750092/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27425054/viewspace-750092/