欢迎来到天天文库
浏览记录
ID:29862745
大小:616.00 KB
页数:48页
时间:2018-12-24
《db2隔离级别和锁》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、深入解析DB2------高级管理、内部体系结构与诊断案例第6章我们在进行客户支持时遇到最多的话题之一就是锁。“为什么DB2锁住了这个表、行或者对象?”,“这个锁会阻塞多长时间及为什么?”;“为什么出现了死锁?”,“我的锁请求在等待什么?”,诸如此类问题等等。更仔细地分析一些常见的锁示例可以说明DB2锁定策略背后的原则。在国内很多DB2用户都会碰到有关锁等待、死锁和锁升级等锁相关的问题,本章将会对这些问题以及解决方法做详细的讲解。本章主要讲解如下内容:·隔离级别和锁·加锁总结·乐观锁·内部锁·设置锁相关的注册变量6.1 隔离级别和锁要
2、维护数据库的一致性和数据完整性,同时又允许多个应用程序同时访问一个数据库,将这样的特性称为并发性。DB2数据库尝试强制实施并发性的方法之一是使用隔离级别,它决定在第一个事务访问数据时,如何对其他事务锁定或隔离该事务所使用的数据。DB2使用下列隔离级别来强制实施并发性:·可重复读(ReapeatableRead,RR)·读稳定性(ReadStability,RS)·游标稳定性(CursorStability,CS)·未提交的读(UncommittedRead,UR)隔离级别是根据称为现象(Phenomena)的三个禁止操作序列来声明的:
3、·脏读(DirtyRead):在事务A提交修改结果之前,其他事务即可看到事务A的修改结果。·不可重复读(Non-RepeatableRead):在事务A提交之前,允许其他事务修改和删除事务A涉及的数据,导致事务A中执行同样操作的结果集变小。·幻像读(PhantomRead):事务A在提交查询结果之前,其他事务可以插入或者更改事务A涉及的数据,导致事务A中执行同样操作的结果集增大。数据库并发性(可以同时访问同一资源的事务数量)因隔离级别不同而有所差异,可重复读隔离级别可以防止所有现象,但是会大大降低并发性。未提交读隔离级别提供了最大的并
4、发性,但可能会造成“脏读”、“幻像读”或“不可重复读”现象。DB2默认的隔离级别是CS。6.1.1 可重复读可重复读隔离级别是最严格的隔离级别。在使用它时,一个事务的操作结果完全与其他并发事务隔离,脏读、不可重复读、幻像读都不会发生。当使用可重复读隔离级别时,在事务执行期间会共享(S)锁定该事务以任何方式引用的所有行,在该事务中多次执行同一条SELECT语句,得到的结果数据集总是相同的。因此,使用可重复读隔离级别的事务可以多次检索同一行集,并可以对它们执行任意操作,直到提交或回滚操作终止事务。但是,在事务提交前,不允许其他事务执行会影
5、响该事务正在访问的任何行的插入、更新或删除操作。为了确保这种行为,需要锁定该事务所引用的每一行——而不是仅锁定被实际检索或修改的那些行。因此,如果一个表中有1000行,但只检索两行,则整个表(1000行,而不仅是被检索的两行)都会被锁定。输出结果如下:C:>db2+cselectempno,firstnme,salaryfromemployeewhereempnobetween'000010'and'000020'withrrEMPNOFIRSTNMESALARY-----------------------------000010
6、CHRISTINE152750.00000020MICHAEL94250.002条记录已选择。我们通过“getsnapshotforlocksonsample”命令来监控表加锁情况,输出结果如下:C:>db2updatemonitorswitchesusinglockonDB20000IUPDATEMONITORSWITCHES命令成功完成。C:>db2getsnapshotforlocksonsample
7、more--------------略------------------锁定列表锁定名称=0x020006000E0040
8、010000000052锁定属性=0x00000010发行版标志=0x00000004锁定计数=1挂起计数=0锁定对象名=20971534对象类型=表表空间名=USERSPACE1表模式=DB2ADMIN表名=EMPLOYEE方式=S--注:虽然读取了两行,但是整个表加S锁如果使用这种隔离级别,不管你从表中读多少数据,整个表上都加S锁,直到该事务被提交或回滚,表上的锁才会被释放。这样可以保证在一个事务中即使多次读取同一行,都会得到相同结果集。另外,在同一事务中如果以同样的搜索标准重新打开已被处理过的游标,那么得到的结果集不会改变。可重
9、复读相对于读稳定性而言,加锁的范围更大:对于读稳定性,应用程序只对符合要求的所有行加锁;而对于重复读,应用程序将对整个表都加S锁。可重复读会锁定应用程序在工作单元中引用的整个表。利用可重复读,一个应用程序在打开游标的相同
此文档下载收益归作者所有