设为首页 收藏本站
查看: 863|回复: 0

[经验分享] DB2数据库中的锁和并发性控制

[复制链接]

尚未签到

发表于 2016-11-16 07:20:20 | 显示全部楼层 |阅读模式
  1.  引导
现今的应用系统一般都需要相对较强的多用户同时访问的能力。作为应用系统基础的数据库产品对多用户能力的支持也就越发重要。现在的DB2 UDB系统中,主要通过锁和隔离级别这两个主要的工具来控制并发连接,维护数据库中的数据在高并发的环境下的安全。
我在这里将简要的阐述一下锁和隔离级别。
2.  锁
DB2 UDB中,锁的主要作用对象是表和行。其他如表空间和索引也是锁的对象,但是因为其多为系统控制,管理员和用户使用较少,在这里就不涉及了。
  对于行级锁和表级锁,它们的区别主要是锁的对象不同。当然锁对象的不同连带也会影响DB2的并发能力。
  DB2中的表级锁主要有以下几种:
  IS锁:此锁作用于整个表,表示拥有此锁的应用连接要读取表中的某些数据,但是在此应用连接读取具体的数据时,还必须获得该行的行级锁;
  IX锁:此锁作用于整个表,表示拥有此锁的应用连接需要独占使用表中的某些数据,但是在此应用连接独占使用具体的数据时,还必须获得该行上相应的行级锁;
  SIX锁:此锁是锁转换的产物,表示应用连接拥有S和IX锁的特性;
  S锁:此锁作用于整个表,拥有此锁的应用连接可以读取表中的任何纪录;
         U锁:此锁作用于整个表,拥有此锁的应用连接可以读取表中的任何纪录,也可以更新表中的纪录,但是更新时需要再获得X锁;此锁主要在“select … with update”语句建立的可更新游标中起作用,其他的应用可以读取表中的纪录,但是不能更新它;
  X锁:此锁作用于整个表,拥有此锁的应用连接独占的使用表中的任何纪录;可以进行更新或其他操作;
  Z锁:此锁作用于整个表,也称超级独占锁,主要是在象修改表的定义、删除表这一类的语句中会使用。拥有此锁的应用连接对该表有完全的控制权。其他的任何应用不能读取或更新表中的任何纪录。
  现在我们主要看一下IS/IX/SIX这三个锁。在这三个锁中IS/IX本身并不具备使得应用连接可以读取或更新纪录的能力,应用连接要读取和更新纪录时,需要再得到相应的行级锁;反之亦然,任何应用要获得行级锁操作数据记录之前,也必须获得某个相应的表级锁。SIX锁也是类似的情况。这就是为什麽在很多情况下我们使用的是行级锁,但是用快照(SNAPSHOT)等工具却能够看到有表级锁存在的原因。
那么DB2中又有哪些行级锁呢?让我们来看下面的这张图:
  此图中列出了DB2中包含的行级锁。表中的第三列指出,要获得此行级锁之前,需要预先获得的表级锁,这里列出的是最低要求。
  这六个行级锁的主要功能如下:
  S锁:此行级锁的拥有者可以读取该行的信息;
  U锁:此行级锁的拥有者可以读取该行的信息,如果要更新该行,则仍然需要一个行级的X锁;其他的应用只能读取该行的信息;此锁主要是用于FOR UPDATE的游标。
  X锁:此行级锁的拥有者可以更新该行的纪录,其他的应用不能连接此行的信息;
  W锁:此锁和X锁类似,不同之处是此锁和NW锁兼容;
  NS锁:类似于S锁,用于Next Key;
  NW锁:类似于W锁,用于Next Key;
  在DB2数据库中,是通过行级锁和表级锁协调作用来提供较好的并发性,同时保证数据库中数据的安全。在DB2中缺省情况下使用行级锁(当然需要IS/IX锁配合),只有当出现锁资源不足,或者是用命令指定使用表级锁的情况下,才会在应用连接中使用表级锁。
      3.  隔离级别
下面让我们来看一下隔离级别。隔离级别主要用于控制在DB2根据应用提交的SQL语句向DB2数据库中的相应对象加锁时,会锁住哪些纪录,也就是锁定的范围。隔离级别的不同,锁定的纪录的范围可能会有很大的差别。
  隔离级别分为RR/RS/CS/UR这四个级别。下面让我们来逐一论述:
  RR隔离级别:在此隔离级别下,DB2会锁住所有相关的纪录。在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁;如果是更新,则加独占锁。由于会锁定所有为获得SQL语句的结果而扫描的纪录,所以锁的数量可能会很庞大,这个时候,索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫描的纪录数量。
  RS隔离级别:此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。不论是读取,还是更新,如果SQL语句中包含查询条件,则会对所有符合条件的纪录加相应的锁。如果没有条件语句,也就是对表中的所有记录进行处理,则会对所有的纪录加锁。
  CS隔离级别:此隔离级别仅锁住当前处理的纪录。
  UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。对于非只读的操作,它的锁处理和CS相同。
  在这四种隔离级别中,CS是缺省值。这四种隔离级别均可以保证DB2数据库在并发的环境下不会有数据丢失的情况发生。要注意的是如果对纪录进行了修改,需要在相应的纪录上加独占类型的锁,这些独占类型的锁直到交易结束时才会被释放,这一点在四种隔离级别下都是相同的。
  4.  结束语
我们已经对DB2中的表锁,行锁,隔离级别进行了论述。DB2数据库的并发控制主要是通过这些机制。理解了这些概念,我们就可以在使用DB2数据库时根据系统的实际需要来设计锁模式和隔离级别,来实现我们的系统要求,在保障数据安全的前提下,提供较好的并发性。
  本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mgoann/archive/2010/06/20/5681721.aspx

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-300891-1-1.html 上篇帖子: 让数据库飞起来 十大DB2优化技巧 下篇帖子: DB2 "APP_CTL_HEAP_SZ" 堆中没有足够的存储器可用来处理语句
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表