Oracle锁机制的总结【转】

  最近在研究Oracle锁机制的时候发现网上的资料鱼龙混杂将,很多将问题复杂化,让人感觉没有条理性。经过查询原始理论资料,总结如下:

         在数据库理论中,我们知道。我们在执行并发访问数据库表时,如果没有任何一致性控制措施,那么会出现以下几种数据不一致的情况:1)提交被覆盖;2)不可重复读(其中包括了幻读);3)读“脏数据”。经过仔细分析,发现引起这些情况的根本原因是:在对数据库公共资源访问时,出现了事务交叉的情况。因此,在数据库的理论里有“可串行化”这种衡量标准,就是说:如果我们在并发情况下通过对并发事务的控制得到的最终结果和我们按顺序一个个执行事务是一样的结果,那么我们就认为这种控制是“可串行化”的,是正确的。

          锁机制是当前解决这些问题的最有效的办法,以下的两个概念“基本锁”和“意向锁”是最基本的两个概念,是构成所有其他锁的基础。
          1)为了在并发性和一致性这对矛盾中合理取舍,提供了两种最基本的锁:共享锁(读锁)、排它锁(写锁)。
         共享锁(S):如果事务T对表A加上共享锁,则事务T可以读该表,但是不能修改该表数据。其他事务也只能对该对象加上共享锁,但是不能加上排他锁。这就保证了其他事务可以读A表数据,但是不能修改A表数据(这就不会影响到读该表的事务了,有利于并发操作)。
         排他锁(X):如果事务T对对象A加上排他锁,则只允许T对A对象读取和修改,其他事务不能对A增加任何锁,只到T释放加载A上的排他锁。
         那么如何使用这些锁解决问题呢?数据库的基本理论提出了三种级别的封锁协议,封的越高,控制的范围越大,一致性也越好,并发性也越差。具体的大家可以查资料,也很简单,这里为了节约篇幅不再叙述。
          2)可是动辄就给整个表加锁,这有点鲁莽草率。我们知道,在一个并发的环境下,我们的程序(事务)操作的常常并不是表中的同一样数据,而这样大范围的控制表数据很显然不利于并发,那么我们可以针对需要缩小控制范围,于是提出了“多粒度封锁”的概念。也就是说,程序(事务)既可以封锁整个表,也可以只封锁某些和我们有关的行,这样就不会影响其他程序(事务)到该表中其他的行。可是新的问题又来了,我们如果要对某个表进行某种操作,比如删除整个表的数据,那么数据库程序就要遍历整个表的每个行,这很显然过于消耗资源,那咋办?于是,“意向锁”应运而生。意向锁的概念基本上是这个意思:如果我们要封锁表的某个行,则也在该行所在的表上加上锁。这样的话在对整个表进行操作时,就不用遍历表里的所有行了。通过和前边提到的共享锁和排他锁,我们组合出三种锁:
           意向共享锁(IS):如果我们对表加IS锁,表示该表中的某个行被加上了S锁。
           意向排他锁(IX):如果我们对表加IX锁,表时该表中的某个行上被加上X锁。
           共享意向排他锁(ISX)。表示先对某个表加上S锁,然后再加上X锁,表示要读取整个表的数据,但是只对其中的一部分行做修改。

        那么最终一共得到5种锁:共享锁(S)、排他锁(T)、意向共享锁(IS)、意向排他锁(IX)、共享意向排他锁(SIX)。

        好,谈完理论,我们和具体的数据库Oracle结合起来,Oracle一共提供了共享锁(S)、排他锁(T)、行级共享锁(RS)、行级排他锁(RX)、共享行级排他锁(SRX)。和上一句话一对比,我们就知道了,它们是一一对应的。可是,Oracle作为一个成功的数据库,总是有自己别出心裁的地方。可能Oracle认为读数据的时候加锁这种机制,在很大程度上是浪费,比如用户修改的数据大多数是自己的不会影响到别的用户(只局限于某些行,不会影响其他行)。所以,默认情况下,Oracle在读取表中数据的时候并没有加锁,而是采用了回滚段的策略解决了这个问题,具体的原理在稍后再说。这样的确是提高了并发性,但是我认为,这其实也是种冒险行为,一旦出现用户B必须要读取用户A的数据,而且要参考读取的结果进行一些重要的操作时,这个时候就需要我们自己手动去加锁了(Oracle的确提供了这种功能,让我们自己用语句去加锁)。下边,我们详细谈下Oracle自己锁的具体行为:
        共享锁:通过lock table in share mode命令添加该S锁。在该锁定模式下,不允许任何用户更新表。但是允许其他用户发出select …from for update命令对表添加RS锁。
        排他锁:通过lock table in exclusive mode命令添加X锁。在该锁定模式下,其他用户不能对表进行任何的DML和DDL操作,该表上只能进行查询。
        行级共享锁:通常是通过select … from for update语句添加的,同时该方法也是我们用来手工锁定某些记录的主要方法。比如,当我们在查询某些记录的过程中,不希望其他用户对查询的记录进行更新操作,则可以发出这样的语句。当数据使用完毕以后,直接发出rollback命令将锁定解除。当表上添加了RS锁定以后,不允许其他事务对相同的表添加排他锁,但是允许其他的事务通过DML语句或lock命令锁定相同表里的其他数据行。
       行级排他锁:当我们进行DML时会自动在被更新的表上添加RX锁,或者也可以通过执行lock命令显式的在表上添加RX锁。在该锁定模式下,允许其他的事务通过DML语句修改相同表里的其他数据行,或通过lock命令对相同表添加RX锁定,但是不允许其他事务对相同的表添加排他锁(X锁)。
       共享行级排他锁:通过lock table in share row exclusive mode命令添加SRX锁。该锁定模式比行级排他锁和共享锁的级别都要高,这时不能对相同的表进行DML操作,也不能添加共享锁。

        好了,引用别人的一个例子来描述Oracle如何通过回滚段来解决重复读和幻读的问题:
        如果有一个事务A执行以下语句:update employees set last_name='HanSijie'  where employee_id=100;如果当前有一个用户(假设为B)发出SQL语句,检索employee_id为100的记录信息,这时服务器进程发现被检索的记录有锁定标记,说明当前该记录已经被其他用户修改了,但是还没提交。于是根据数据行头部记录的ITL槽的槽号,在数据块头部找到该ITL槽,并根据其中记录的undo数据块的地址,找到该undo 数据块,将其中所保存的改变前的旧值取出,并据此构建CR(Consistent Read一致性读)块,该CR块中的数据就是被更新的数据块(也就是58号数据块)在更新前的内容。于是根据该CR块的内容,将用户所需要的信息返回给C。
        以上的例子,可以证明之前我所说的担心的地方,也就是说,假如我们这个用户B要参照这个数据来决定下一步程序重要的走向,那么我们在做这件事情的时候,必须也要对该记录加锁,因为Oracle并没有对我们的读取采取加锁的行为。我们必须要控制我们在做下一步动作前的这个“决定因素”不能被别人修改。

        另外,还有一点总结,由于我没有深入研究过多线程编程,只是在研究Struts2时,对Struts2处理Action的多线程问题时研究了下ThreadLocal模式。得出以下总结,可能不完善。个人认为,资源分为两种,一种是:多个线程必须交互的资源,比如表中的数据,再比如必须参考的某个成员变量。还有一种是:多线程可以不用交互的资源,比如我们Struts2中的成员变量。第一种情况,相当于是个十字路口,在不允许“修天桥”的情况下,多个线程必须要走这个交叉点。第二种情况是,可以通过“修天桥”来避免在同一个空间里的冲突。ThreadLocal就是基于这种思想,是为了降低线程冲突,也是为了节约资源等待的时间,本质上是计算机中的真理“空间换时间”。

        以上内容有很多借鉴了数据库基本理论,但是将抽象的对象具体到表和表中的行,这样有助于理解。主要是为了澄清一些概念,比如有人将“幻读”单独作为一种不一致情况,而省去了“提交被覆盖”这种情况。我个人认为,很显然,幻读只是不可重复读的一种情况(幻读强调的是集合)。中间也摘录了其他人文章中的部分内容。如果中间有错误,希望留言评论。

转载于:https://www.cnblogs.com/hsz1124/p/7409981.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371430.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2020暨阳学院园林计算机考研考场,【图片】2020考研,老学长教你如何规划!【计算机考研吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼二、关键一步——院校选择我把各位同学的院校选择阶段分为以上几个阶段,因为考研这一年中,很多人的目标院校并不是固定不变的,而是随着不同阶段而改变的。学长我在大三下学期这一时间段内也多次更…

List Box 控件

1 //定义变量,并关联控件与变量。IDC_RecvData为控件ID,recvData为控件对应的变量名 2 CListBox recvData; 3 4 DDX_Control(pDX, IDC_RecvData, recvData); 5 6 //向List Box控件IDC_RecvData中添加一行数据 7 CString str; 8 recvData.Ad…

JavaOne 2012:向上,向上和向外:使用Akka扩展软件

在最后的社区主题演讲后,我前往希尔顿金门大桥3/4/5观看了维克多巴生 ( Viktor Klang )的( Typesafe )“上,下,外:Akka”演讲。 巴生(Klang)是Akka的技术主管…

华北科技学院计算机期末考试,华北科技学院 专业计算机 考试专用

1不能应用修剪命令“trim”进行修剪的对象是(D、文字) 。2. 命令行(B.不能随意移动)3. 布尔运算中差集的热键为(A.SU)4. 定距等分点用( C.DIST)命令5. 标高是以( B.厘米) 为单位6. 在建筑平面图中用以指明朝向的是( B.指北针)7. A3图纸的尺寸是( c.420x297)8. 既可以绘制直线&a…

redux-plain-english-workflow

https://quickleft.com/blog/redux-plain-english-workflow/转载于:https://www.cnblogs.com/skating/p/6495384.html

Spring测试支持和上下文缓存

Spring为单元测试和集成测试提供了全面的支持-通过注释来加载Spring应用程序上下文,并与JUnit和TestNG等单元测试框架集成。 由于为每个测试加载大型应用程序上下文需要时间,因此Spring智能地为测试套件缓存应用程序上下文–通常,当我们通过a…

perl6正则 4: before / after 代码断言: ?{} / !{}

<?before> <? befor XXX> 某字符在 xxx 之前 <?after > <?after XXX> 某字符之后有XXX 对应的取反分别为: <!before > <!before XXX> XXX之前没有 <!after> <!after xxx> 某字符后面不是 xxx say "foobar" ~~…

mac 下JDK 与 tomcat 的安装与配置

一.Mac下JDK的安装 1.先检测Mac是否已经安装过JDK&#xff0c;在终端中输入java 或者 javac 显示说明&#xff0c;表明已经安装过JDK&#xff0c;JDK版本查询终端键入java &#xff0d;version&#xff0c;终端会返回JDK的版本号。 2.如果没有安装JDK&#xff0c;登陆 http://w…

新型发明创造大赛计算机类,2017年发明杯全国高职高专大学生创新创业大赛

以“发明创新实现梦想、创意创业改变生活”主题活动为依托&#xff0c;把课内与课外教育相结合&#xff0c;学校教育、家庭教育与社会教育相结合&#xff0c;培养广大在校大学生的科技创新意识和实践动手能力&#xff0c;激发他们设计创造的乐趣&#xff0c;使广大大学生大胆创…

如何写出安全的API接口(参数加密+超时处理+私钥验证+Https)- 续(附demo)

转载&#xff1a;http://www.cnblogs.com/codeon/p/6123863.html 上篇文章说到接口安全的设计思路&#xff0c;如果没有看到上篇博客&#xff0c;建议看完再来看这个。 通过园友们的讨论&#xff0c;以及我自己查了些资料&#xff0c;然后对接口安全做一个相对完善的总结&#…

PrimeFaces在GlassFish 3.1.2.2上推动大气

PrimeFaces 3.4在三天前问世。 除了通常令人敬畏的新组件和更新组件之外&#xff0c;它还包括新的PrimeFaces Push框架。 基于Atmosphere&#xff0c;这为您的应用程序提供了简单的推送机制。 这是在最新的GlassFish 3.1.2.2上配置和运行它的方法。 准备工作 像往常一样&#…

部分视图跳转

var album GetDailyDeal(); return PartialView("_DailyDeal", album); 通过NuGet需要添加microsoft.jquery.unobtrusive.ajax 方法一 在BundleConfig.cs 里添加 bundles.Add(new ScriptBundle("~/bundles/jqueryajax").Include("~/Scripts/jquery…

计算机二级目录设置,word2设置标题格式,生成目录,奇偶页设置等等,适用考计算机二级办公软件,也适用于毕业论文格式设置...

word2设置标题格式,生成目录,奇偶页设置等等,适用考计算机二级办公软件,也适用于毕业论文格式设置 这是第2部分word资料 , 跟之前的第一部份word资料合为一份第二题2、在正文前按序插入节&#xff0c;使用“引用”中的目录功能&#xff0c;生成如下内容&#xff1a;(1) 第1节&a…

JBoss AS 7类加载说明

这是示例章节&#xff0c;摘自Francesco Marchioni编辑的JBoss AS 7 Configuration Deployment and Administration一书&#xff0c;该书正在运行一个名为mastertheboss.com的JBoss门户。 根据Java EE规范的要求&#xff0c;理想情况下&#xff0c;应用程序服务器应为其部署的应…

打印机 共享 问题

1 用户提报无法打印&#xff0c;经查被共享打印机无法联网&#xff0c;先检查网线是否正常&#xff08;换其他电脑是否能行&#xff09;&#xff0c;再检查交换机是否正常&#xff0c;经查交换机需要重启&#xff0c;然后解决问题。 2 被共享机器为32位操作系统&#xff0c;其余…

CoordinatorLayout 中ToolBar遮挡RecyclerView的内容

解决方法:在RecyclerView中添加 app:layout_behavior"string/appbar_scrolling_view_behavior"参考资料:http://stackoverflow.com/questions/32855889/content-behind-coordinatorlayout-appbarlayout 转载于:https://www.cnblogs.com/niluogege/p/6511094.html

兵团职称计算机准考证查询,兵团初级会计准考证打印入口官网

兵团初级会计准考证打印入口官网为财政部会计资格评价中心网(http://kzp.mof.gov.cn)。准考证打印时间在4月16日前公布&#xff0c;考生需要在规定时间登录财政部会计资格评价中心网(http://kzp.mof.gov.cn)下载并打印准考证。未在上述时限内下载打印准考证的&#xff0c;视作放…

用于集成测试的Maven Cargo插件

在项目生命周期中&#xff0c;非常普遍的需求是设置集成测试。 幸运的是&#xff0c;Maven具有针对此确切方案的内置支持&#xff0c;具有默认构建生命周期的以下阶段&#xff08;来自Maven 文档 &#xff09;&#xff1a; 集成前测试 &#xff1a; 执行集成测试之前所需的操作…

jquery-文档操作

1.text() 设置或返回元素的text值 <div id"divname">old text</div> $(#divname).text("new text"); 将改变显示的old为new [1] 参考w3scholl文档操作 转载于:https://www.cnblogs.com/hellokittyblog/p/9128397.html

bzoj 4259: 残缺的字符串

这题好神啊&#xff0c;居然是fft&#xff0c;表示一直在往数据结构上想。 把*当成0&#xff0c;那么两个串可以匹配当且仅当$$\sum (a[i]-b[i])^2\times a[i]\times b[i]0$$ 我们可以把平方拆开&#xff0c;然后就变成了几个乘积相加的形式&#xff0c;那就大力翻转一个串然后…