oracle锁和闩_笔记13:测试闩定共享资源的开销(在linux+Oracle上
测试闩定共享资源的开销(在linux+Oracle上搭建JAVA环境)
手动锁定和用户定义锁
更新一个表时,Oracle会为它加一个TM锁,以防止其他会话删除这个表(实际上,也会防止其他会话对这个表执行大多数DDL)。在我们修改的各个块上会加上TX锁,这样就能告诉别人哪些数据是“我们的”。数据库采用DDL锁来保护对象,这样当我们正在修改这些对象时,别人不会同时对它们进行修改。数据库在内部使用了闩和锁来保护自己的结构。
接下来,我们来看看如何介入这种锁定活动。有以下选择。
.通过一条SQL语句手动地锁定数据
.通过DBMS_LOCK包创建我们自己的锁
1、手动锁定
我们可能想使用手动锁定(manual locking),SELECT FOR UPDATE语句就是手动锁定数据的一种主要方法。在前面的例子中,曾经用过这个语句来避免丢失更新问题。我们已经看到,可以用这种方法来串行访问详细记录,从而执行业务规则。
还可以使用LOCK TABLE语句手动地锁定数据。这个语句实际上很少使用,因为锁的粒度太大。它只是锁定表,而不是对表中的行锁定。如果你开始修改行,它们也会被正常地“锁定”。所以,这种方法不能节省资源(但在其他RDBMS中可以用这个方法节省资源)。如果你在编写一个大批量的更新,它会影响给定表中的大多数行,而且你希望保证没有人能“阻塞”你,就可以使用LOCK TABLE IN EXCLUSIVE MODE语句。通过以这种方式锁定表,就能确保你的更新能够执行所有工作,而不会被其他事务所阻塞。不过,有LOCK TABLE语句的应用确实很少见。
2、创建自己的锁
通过DBMS_LOCK包,Oracle实际上向开发人员公开了它在内部使用的队列锁(enquere lock)机制。你可能会奇怪,为什么想创建你自己的锁呢?答案通常与应用有关。例如,你可能要使用这个包对Oracle外部的一些资源进行串行访问。假设你在使用UTL_FILE例程,它允许你写至服务器文件系统上的一个文件。你可能已经开发了一个通用的消息例程,每个应用都能调用这个例程来记录消息。由于这个文件是外部的,Oracle不会对试图同时修改这个文件的多个用户进行协调。现在,由于有了DBMS_LOCK包,在打开、写入和关闭文件之前,可以采用排他模式请求一个锁(以文件命名),一次只能有一个人向这个文件写消息。这样所有人都会排队。通过利用DBMS_LOCK包,等你用完了锁之后能手动地释放这个锁,或者在你提交时自动放弃这个锁,甚至也可以在你登录期间一直保持这个锁。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5206.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
