楼主: ZALBB

[精华] 我对ORACLE数据锁的一点体会

[复制链接]
招聘 : 数据库管理员
论坛徽章:
66
ITPUB元老
日期:2005-07-16 18:49:11授权会员
日期:2005-10-30 17:05:33ITPUB新首页上线纪念徽章
日期:2007-10-20 08:38:44现任管理团队成员
日期:2011-05-07 01:45:08版主3段
日期:2012-05-15 15:24:11
21#
发表于 2004-10-4 10:45 | 只看该作者

Re: 对前面的讨论做一个小结

最初由 jeffli73 发布
[B]详见:
http://www.itpub.net/202492,2.html [/B]


其实你公布了文章也不支减少书的购买量,
因为第一册上的文章几乎在网上都有,
但做为珍藏版,很多人都愿意买本书慢慢回味的。

使用道具 举报

回复
招聘 : 灾备架构师
论坛徽章:
53
IT宝贝
日期:2009-02-23 21:48:25现任管理团队成员
日期:2011-05-07 01:45:08IT宝贝
日期:2013-06-18 18:07:16
22#
发表于 2004-10-8 23:03 | 只看该作者
哎,很长时间不弄ORACLE,落伍了,落伍了呀

使用道具 举报

回复
论坛徽章:
0
23#
发表于 2004-10-15 09:32 | 只看该作者
Oracle读数据时是不加锁的,通过rollback segment来保证不脏读和可重复读,那么DML锁中的S锁究竟做什么用.
  另外根据我对大侠上面文章的理解,是否是这样的:
  1.一个session在表级加RS锁,并不是准备在行级加S锁,而是为了在行级加X锁,如:selelct * from table for update 这样的语句。那么SRX锁又是做什么用的呢?
  2.一个session在表级加RX锁,是为了准备在行级加X锁,如:insert/update/delete语句。
  3.oracle的常规锁R锁和S锁(但我还不知到S锁在oracle中究竟做什么用),是否只对行级进行封锁。

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:342012新春纪念徽章
日期:2012-01-04 11:49:54
24#
发表于 2004-10-15 11:46 | 只看该作者
最初由 ZALBB 发布
[B]jeffli73,请看看我的问题:

问:我说的那个意向锁,和你说的有差别吗?差别在哪里?
2、你如何理解ORACLE定义的7个级别的锁?为什么要这样定义? [/B]


看了你和jeffli73关于锁的对话,写得非常好,不过和oracle官方文章的描述还是有一定的差别,先摘录如下,供各位参考:

Lock Modes
Locks are applied to both compound and simple objects. The classic example of a compound object and its component parts is a table and its rows. A cache buffer is an example of a simple object. Simple objects may only be locked in the following modes:
Exclusive
If a session needs to modify a simple object, then an exclusive lock is
required on the resource to prevent any concurrent access.
Shared
If a session needs to inspect a simple object, then a shared lock on the
resource is sufficient to ensure that the data structure will not be modified by another session, while allowing concurrent shared access.
Null
If a session has some information cached about an object, then a null mode lock may be held as a placeholder, even when the resource is not actively being used. A null mode lock does not inhibit any concurrent access, but if the resource is invalidated, the null mode lock acts as a trigger for the session to invalidate its private cached information. There is an important difference between holding a null mode lock, and not holding a lock at all.

In addition to the modes above, compound objects may also be locked in the following modes:
Sub-shared
If a session needs shared access to part of a compound object, then a shared lock on the entire compound resource would be unduly restrictive, because it would prevent exclusive access to other parts of the compound resource. In such cases, a sub-shared lock is used instead.
Sub-exclusive
If a session needs exclusive access to part of a compound resource, then a sub-exclusive lock is sufficiently restrictive.
Shared-sub-exclusive
This lock mode is used when a session needs exclusive access to part of a compound resource and shared access to the entire compound resource at the same time.

使用道具 举报

回复
论坛徽章:
0
25#
发表于 2004-10-15 14:05 | 只看该作者
to:everybody
  首先更正一下我上面帖子的错误,oracle的常规锁为S锁和X锁
  太粗心了!呵呵
to:耕耘者
  我认为oracle的定义和我的理解并没有太大的出入,我是一个程序员,所以是从程序员的角度来理解的,因为程序员所涉及的大多数oralce object都是表
   我所说的表级,也就相当于oracle定义的compound objects
   我所说的行级,也就相当于oracle定义的simple object

   总之就是相当于多粒度树上的两层节点,他们之间是父子。

使用道具 举报

回复
论坛徽章:
0
26#
发表于 2004-10-15 14:15 | 只看该作者
对于Oracle定义的各种锁Exclusive(X锁),Shared(S锁),Sub-Shared(RS锁),Sub-Exclusive(RX锁),Shared-Sub-Exclusive(SRX锁)
对于null锁,还没有研究
  oracle定义的各种锁的使用方法和jeffi73所说的并没有区别,例如在Sub-Shared锁的定义中"a part of the compound object",a part 就是行,而compound objet就是表

使用道具 举报

回复
论坛徽章:
3
授权会员
日期:2005-10-30 17:05:33ITPUB技术丛书作者
日期:2010-09-26 15:24:56优秀写手
日期:2014-02-13 06:00:15
27#
发表于 2004-10-16 22:35 | 只看该作者

把总结转过来可能更方便一些

在Oracle数据库并发环境下,对于表,既要保护其数据,又要保护其结构(结构信息存储在数据字典中),很自然,针对这两种保护要求,就有了两种类型(Type)的锁:保护数据的锁我们叫数据锁(DML locks或data locks),保护结构的我们叫字典锁(DDL locks或dictionary locks)。

对于数据锁,为了适应不同事务的不同要求,提供两个层次(粒度)的锁,即表级锁(Table Locks ,TM)与行级锁(Row Locks ,TX)。
在这两个层次上,经典的上锁的方式(Mode)有两种,即共享锁(S锁)与排它锁(X锁)。

为了方便地进行锁冲突的检测,希望在表(上)级能够标识行(下)级加锁的情况,这就引入了“意向锁”(intention lock mode)的概念。根据在行级要加S锁或X锁的不同,在表级相应的就有两种意向锁,即:如果事务要在行级获得S锁,它需要首先在表级获得意向共享锁(Intent Share Lock,IS锁);如果事务要在行级获得X锁,它需要首先在表级获得意向排它锁(Intent Exclusive Lock,IX锁)。这两种意向锁与经典的S锁、X锁组合,还会产生一种新的锁:共享意向排它锁(Share Intent Exclusive Lock,SIX锁),它表示持有该锁的事务在表级加了传统的共享锁(S锁),同时该事务还将对表中的某些行加排它锁(X锁)。

这样,在表级数据锁的加锁方式就有了5种:即S、X、IS、IX、SIX。
在Oracle中,与IS对应的锁叫做Row Share Table Locks (RS)或subshare table lock, SS,它可以通过SELECT ... FOR UPDATE语句获得,但需要注意的是,这个语句在行级获得的也是排它锁,即如果两个SELECT ... FOR UPDATE语句要选定同一行,则后面的事务将被阻塞,这是与上面一般意义的定义有所不同,这时RS锁可以理解为持有该锁的事务将要修改选定的某些行。

在Oracle中,与IX对应的锁叫做Row Exclusive Table Locks (RX)或subexclusive table lock, SX,它可以通过INSERT/UPDATE/DELETE语句获得,它表征持有该锁的事务已经修改了表中的某些行。

在Oracle中,与SIX对应的锁叫做Share Row Exclusive Table Locks (SRX)或sshare-subexclusive table lock, SSX。

这样,Oracle对表级数据锁的加锁方式就有:即S、X、RS、RX、SRX等5种;而在行级只有X锁。

在Oracle中,对于字典锁,也有共享与排它之分:Share DDL Locks与Exclusive DDL Locks。对于要获得Exclusive DDL Locks的DDL操作(如ALTER、DROP等),它还必须要获得该表排它的数据锁,这样如果在某个表上有未提交的事务(即该表有某种类型的表级锁),其它SESSION提出的DROP表的操作就不会成功,因为它要向表施加X锁,与表上已有的锁不相容。
所以说,表级的数据锁既能防止与之冲突的DML操作,也能防止与之冲突的DDL操作,但不能因此就把表级的数据锁与字典锁混为一谈。

使用道具 举报

回复
论坛徽章:
0
28#
发表于 2004-10-18 08:57 | 只看该作者
to:jeffi73
  根据大侠所解释:在行级加的都是X锁,而在表级加的都是意向锁,那么orcle中s锁究竟是什么时候用呢?
  另外,如果在表级加RS锁,是为了在行级加X锁,如:select * from table for update 的语句,那么SRX锁在oracle中是什么时候使用呢,因为SRX锁相当于SIX锁,而SIX锁是先读表,然后再修改某些行,我个人感觉应该是 select * from table for update这种情况使用,很迷惑!
  希望大侠回答我的两个问题。

使用道具 举报

回复
论坛徽章:
2
2011新春纪念徽章
日期:2011-02-18 11:43:342012新春纪念徽章
日期:2012-01-04 11:49:54
29#
发表于 2004-10-18 12:42 | 只看该作者
最初由 jacky_liu_cn 发布
[B]to:everybody
  首先更正一下我上面帖子的错误,oracle的常规锁为S锁和X锁
  太粗心了!呵呵
to:耕耘者
  我认为oracle的定义和我的理解并没有太大的出入,我是一个程序员,所以是从程序员的角度来理解的,因为程序员所涉及的大多数oralce object都是表
   我所说的表级,也就相当于oracle定义的compound objects
   我所说的行级,也就相当于oracle定义的simple object

   总之就是相当于多粒度树上的两层节点,他们之间是父子。 [/B]


compound objects和simple object并不是表和行的关系,我的理解是:simple object在锁操作这一级别是不可分割的一个整体,而compound objects则是除了对它的整体(如表)还可以对他的一部分(如部分的数据)进行锁的操作。行在我们所讨论的锁操作中并不是一个simple object,我们在对表中的行进行DML操作时,为了防止与该事务操作相冲突的DDL操作,oracle服务器会自动的在表级加锁,因此可以说行并不是一个可独立操作的锁的单位。
我上一个帖子是官方的一些定义,觉得对准确理解锁的机制和原理有帮助,故转贴于此,当然我觉得jeffli73的论述也可以有助于大家理解和使用锁,但准确性还值得探讨。

使用道具 举报

回复
论坛徽章:
0
30#
发表于 2004-10-18 13:14 | 只看该作者
我还是认为我们前面讨论的与oracle的定义没有冲突,可能是我所说的表和元组与oracle定义的compound object和simple object相比太片面了,或者说前者是后者的一个例子。
  另外oracle修改行时在表级加锁不是为了防止对表进行DDL操作时冲突,而是为了提高任何其他事务在加锁时的锁冲突检查的效率,如果其他事务要执行DDL操作,要申请的是字典锁,字典锁当然也要进行锁冲突检查。如果其他事务只执行DDL操作,也是要进行锁冲突检查的。在表级加锁就是为了提高锁冲突检查的效率。jeffi73在这个问题上做了详细的解释。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表