版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.1、 理解 2锁什么是锁?锁 是一种软件机制, 用于控制对数据库中的数据的访问。在出现同时读取和更新数据的多用户环境中,锁能够确保每个事务的原子性、隔离、一致性和持续性(ACID )不受到威胁,并且维护数据的完整性。锁的粒度Informix提供各种粒度的锁。它们是:?数据库锁: 针对整个数据库的锁?表锁: 针对整个表的锁?页锁: 针对整页数据的锁?行锁: 针对一个数据行的锁?字节锁: 在包含 VARCHAR 的行上的锁?键锁: 在索引中的一个键值上的锁锁的粒度越粗, 它就能锁住越多的数据库对象。例如,对于能够在一个磁盘页上包含4 行的表, 在该页放置一个锁将锁住其中包含的所有4 个行。相反,
2、如果使用行锁,那么将仅锁住一个行。因此,锁的粒度越粗,并发性就越低,从而影响到性能,尤其是应用程序试图访问相同的行集时。不过,粗粒度也意味着在某些情况下锁住相同数量的行需要的锁数量更少。例如,锁住整个表仅需要一个表锁。表的锁模式创建一个表时,它的默认锁粒度是页锁。可以在创建表的过程中使用LOCK MODE 子句覆盖默认值。例如:CREATE TABLE t1(c1 int) LOCK MODE ROW;这个上下文中的锁模式表明访问表时需要使用的锁的粒度。如果从CREATE SQL 语句省略掉这个 LOCKMODE 子句,那么就使用默认的锁模式。如果表已经创建,那么可以使用ALTER TABLE
3、语句更改锁模式。对于以上提到的表t1 例子,您可以使用下面的ALTER 语句将锁模式从行锁更改页锁:dbaccess db1 -ALTER TABLE t1 LOCK MODE(PAGE);可以使用配置参数DEF_TABLE_LOCKMODE 更改已创建的表的默认锁模式。该参数的值可以是ROW或。例如,如果DEF_TABLE_LOCKMODE设置为,那么数据库服务器重启之后创建的表的默认锁模PAGEROW式将为 ROW。类似地,可以使用环境变量IFX_DEF_TABLE_LOCKMODE实现相同的效果。 注意: 如果从运行oninit以启动服务器的窗口设置环境变量,那么通过环境变量指定的默认锁
4、模式将对所有会话有效。然而,如果仅在特定客户端会话环境中设置锁模式,那么它仅对特定会话有效。清单 1-4显示了检查表的锁模式的不同方法(表名为t1 ;数据库名为 db1 ):清单1.使用dbschemadbschema -d db1 -t t1 -ss1/131:64070 07/14/2009 04:51:27802 Row Locking TBLspace use 4 bit bit-maps4.清单2.输出create table "informix".t1(c1 integer) extent size 16 next size 16 lock mode row;清
5、单3.使用oncheckoncheck -pt db1:t1Output:TBLspace Report for db1:informix.t1Physical AddressCreation dateTBLspace FlagsMaximum row sizeNumber of special columns0Number of keys0Number of extents1Current serial value1Current SERIAL8 value1Current BIGSERIAL value1Current REFID value1Pagesize (k)2First exte
6、nt size8Next extent size8Number of pages allocated8Number of pages used1Number of data pages0Number of rows0Partition partnum1049067Partition lockid1049067ExtentsLogical PagePhysical PageSize Physical Pages01:64999882/13.清单4.使用dbaccess从数据库的系统目录表查询系统表dbaccess db1 -> select * from systables where t
7、abname='t1'tabnamet1ownerinformixpartnum1049067tabid100rowsize4ncols1nindexes0nrows0.00created07/14/2009version6553601tabtypeTlocklevelRnpused0.00fextsize16nextsize16flags0sitedbnametype_xid0am_id0pagesize2048ustlowtssecpolicyid0protgranularity字段“locklevel”为 R,表明这是一个行锁。另外,使用onstat -k来监控锁模式。这
8、将在“使用onstat实用程序监控锁”小节进行介绍。回页首3/13.锁的类型数据库、表、页和行(在这个小节中统称为对象)通过不同类型的锁来控制对自身的访问。IDS使用以下类型的锁:共享锁当需要读取数据并且不允许更改行时,那么就可以在该对象(比如表、页或行)上设置一个共享锁。一个对象可以由不同的会话设置多个共享锁。因此,可以在需要时在一个对象上设置多个共享锁。更新 / 提升锁可以在需要更新的对象上设置更新锁。如果一个对象已经设置了共享锁,另一个会话还可以在其上设置一个更新锁。如果需要更改对象,那么更新锁必须提升为独占锁。不过,为了实现独占锁,在提升过程中该对象不能包含共享锁或更新锁。独占锁当一个
9、会话请求单独使用某个对象时,可以在该对象上放置一个独占锁。如果一个对象上已经放置了独占锁,那么其他会话就不能再在该对象上放置其他类型的锁。INSERT 、UPDATE 和 DELETE 语句在它们所更改的行上使用这个锁。在事务完成之后将释放该锁。onstat实用程序和syslocks表使用以下符号表示锁的类型:?共享锁-S?更新锁-U?独占锁-X在某些情况下,可以通过放置一个意向锁(intent lock )来表明要放置特定锁的意向。例如,意向共享锁的表示符号为 IS 。在使用 SELECT 语句期间通常可以在表上看到IS 锁。在使用INSERT 、 UPDATE 或DELETE 语句期间通常
10、可以在表上看到意向独占锁。表 1 使用这些符号列出了一个兼容性矩阵,显示当一个会话已经在某个对象上放置了特定的锁时,另一个会话可以在该对象上请求的锁。表 1. 锁兼容性矩阵持有 X持有 U持有 S持有 IS持有 SIX持有 IX锁锁锁锁锁锁请求 XNoNoNoNoNoNo锁请求 UNoNoYesYesNoNo锁请求 SNoYesYesYesNoNo锁请求 ISNoYesYesYesYesYes锁请求 SIXNoNoNoYesNoNo锁请求 IXNoNoNoYesNoYes4/13.锁回页首锁请求失败当会话请求锁失败时,数据库服务器的默认行为是返回一个错误。要让该会话等待拥有锁的会话释放锁,请在
11、运行预定语句之前运行以下SQL语句:SET LOCK MODE TO WAIT;这将让会话一直等到锁释放。如果要设置固定的等待期限(例如,5 秒),则使用以下语句:SET LOCK MODE TO WAIT 5;回到默认行为:SET LOCK MODE TO NOT WAIT;SET LOCK MODE语句仅在会话级别有效。我们通过以下例子查看锁模式的行为:清单5.开始会话dbaccess - -DROP DATABASE db1;CREATE DATABASE db1 WITH BUFFERED LOG;CREATE TABLE t1 (c1 int);INSERT INTO t1 VALU
12、ES (1);清单6.会话Adbaccess db1 -BEGIN WORK;UPDATE t1 SET c1=5;清单7.会话B5/13.dbaccess db1 -SELECT* FROM t1;清单8.收到的错误244: Could not do a physical-order read to fetch next row.107: ISAM error: record is locked.清单9. onstat -g sql输出$ onstat -g sqlIBM Informix Dynamic Server Version 11.50.FC4 - On-Line - Up 1 d
13、ays 06:16:34 - 149504 KbytesSessSQLCurrentIso LockSQL ISAM F.E.IdStmt typeDatabaseLvl ModeERR ERR Vers Explain30-db1CR Not Wait009.24 Off输出结果显示db1的隔离级别为“Committed Read”(后面将讨论隔离级别)。因为表t1上有一个未提交的更新,错误提示需要使用锁定的记录。让我们在会话B 中尝试使用SET LOCK MODE WAIT语句:SET LOCK MODE TO WAIT;SELECT* FROM t1;这个会话并没有立即返回错误,而是等待
14、锁释放。现在,在会话A 中,完成事务:COMMIT WORK;在会话B 中,现在是等待提交结束之后才返回查询结果。2、死锁当两个会话都持有它们需要使用的锁时就会导致死锁。结果是两个会话都等待对方释放锁。不过,数据库服务器可以检测到这种情况并阻止它发生。例如:T1 :读取行A 并在其上放置一个锁。T2 :读取行B 并在其上放置一个锁。6/13.T1 :在行B 上请求一个锁。T2 :在行A 上请求一个锁。IDS维护一个内部锁表。为了防止出现死锁,IDS将检查内部锁表,查看在会话等待锁期间是否会导致死锁。发生的情况如下所示:T1 :将锁模式设置为等待。T2 :将锁模式设置为等待。T1 :读取行A 并
15、在其上放置一个锁。T2 :读取行B 并在其上放置一个锁。T1 :在行B 上请求一个锁;必须等待T2 在行B 上释放该锁。T2 :在行A 上请求一个锁,但被拒绝了,因为等待该锁的释放会导致死锁。IDS从内部锁表检测到:? T1 持有行 A 上的锁? T2 持有行 B 上的锁? T1 等待 T2 持有的行 B 上的锁如果允许 T2等待 T1 在行A 上持有的锁,那么将出现死锁。因此,锁请求被拒绝,并返回错误(-143ISAM error: deadlock detected)。检查 onstat -p的输出看看是否有死锁:清单10.检查onstat -p输出中的死锁$ onstat -pIBM I
16、nformix Dynamic Server Version 11.50.FC4 - On-Line - Up 2 days 22:34:37 - 157696 KbytesProfiledskreads pagreads bufreads %cached dskwrits pagwrits bufwrits %cached 13851 44301 1894394 99.27 22604 41159 429311 94.73isamtotopenstartread write rewritedeletecommitrollbk11788846449588313413795 4672358450
17、56571783316gp_readgp_write gp_rewrtgp_delgp_alloc gp_free gp_curs0000000ovlockovuserthread ovbuffusercpu syscpunumckpts flushes00089.2313.3236670849bufwaitslokwaits lockreqsdeadlksdltoutsckpwaitscompress seqscans1910750183506401067707/13.ixda-RAidx-RA da-RA RA-pgsused lchwaits231230803313254查看“deadl
18、ks ” 字段,您可以看到在数据库服务器上线至今发生了5 个死锁事件。如果频繁发生死锁,请检查应用程序并交错使用频繁更改的行。通过减少锁等待时间可以降低出现死锁的几率。对于分布式事务, 会话在返回错误之前使用DEADLOCK_TIMEOUT 配置参数等待来自远程数据库的响应。在onstat -p输出中的“dlouts ”字段显示分布式死锁超时的统计数据。日志和非日志数据库在日志数据库中,数据库服务器记录其事务以及在事务期间持有的锁。一般都能够识别到事务持有的锁,除非事务没有提交或被回滚。非日志数据库中没有事务,但仍然使用锁。尽管很容易错过,但是服务器在执行Data Manipulation L
19、anguage时使用锁,并且在该语句完成之后快速释放锁。3、监控锁onstat实用程序监控锁数据库服务器使用的锁保持在一个内部锁表中。使用onstat -k命令可以监控数据库服务器持有的锁的类型和粒度。onstat -k命令的输出包含以下字段:表 2. onstat -k命令输出包含的字段字段说明address锁表中的锁的位置。如果用户线程正在等待这个锁,那么该锁的地址就会出现在onstat -u(用户)输出的wait字段中。wtlist等待锁的用户线程列表的第一项,如果存在的话。owner持有锁的线程的共享内存地址。这个地址与onstat -u(用户)输出中的 address 字段中的地址对
20、应。当持有者值显示在圆括号中时,它表示事务结构的共享内存地址。仅当为全局事务分配锁时才会发生这种情况。这个地址与onstat-G 输出的 address字段对应。lklist刚才列出的持有者持有的链接锁列表中的下一个锁。type使用以下符号表示锁的类型:? HDR - 头部? B- 字节? S- 共享? X- 独占? I- 意向? U- 更新? IX - 意向独占8/13.? IS - 意向共享? SIX - 共享意向独占tblsnum行标识号码。 rowid提供以下锁信息:? 如果 rowid 为 0 ,那么这个锁是一个表锁。? 如果 rowid 以两个 0 结尾,那么这个锁是一个页锁。?
21、如果 rowid 小于等于 6 位数并且不以 0 结尾,那么这个锁可能是一个行锁。? 如果 rowid 大于 6 位数,那么该锁可能是一个索引键 - 值锁。key#/bsiz索引键值号,或为VARCHAR锁锁定的字节数。如果这个字段包含“K-” 并且其后接一个值,那么这是一个键锁。该值标识要锁住的索引。例如,K-1表示为表定义的第一个索引包含一个锁。回页首onstat -k命令的示例输出这个例子使用不遵从ANSI的日志数据库和两个表:CREATE DATABASE db1 WITH LOG;CREATE TABLE t1 (c1 int);CREATE TABLE t2 (c1 int) LO
22、CK MODE ROW;以下值被插入到这两个表中:INSERT INTO t1 VALUES (1);INSERT INTO t2 VALUES (1);INSERT INTO t2 VALUES (2);执行以下语句:BEGIN WORK;UPDATE t1 SET c1=5;UPDATE t2 SET c1=5;9/13.onstat -k的输出:清单11.onstat -k的输出$ onstat -kIBM Informix Dynamic Server Version 11.50.FC4 - On-Line - Up 2 days 21:39:44 - 157696 KbytesLoc
23、ksaddresswtlistownerlklisttypetblsnum rowidkey#/bsiz10a3134d80111535cd80HDR+S100002204010a44bcd801115354880S100002204010a44bd5801115365280S100002204010a44c4d80111537e180HDR+S100002202011348b0280111537e1810a44c4d8HDR+IX1001ef0011348b0a80111537e1811348b028HDR+X1001ef100011348b1280111537e1811348b0a8HDR
24、+IX1001f00011348b2a80111537e1811348b128HDR+X1001f01010U11348b3280111537e1811348b2a8HDR+X1001f01020U9 active, 80000 total, 16384 hash buckets, 2 lock table overflows该输出包含以下信息:?表锁:o查看地址为11348b028的行,其 rowid为 0 ,表明这个锁是表锁。 IX 表明其类型为意向独占。?页锁:o查看地址为11348b0a8的行,其 rowid的最后两位为 00 ,表明这个锁是页锁。类型 X 表明它是独占锁。这是针对t1
25、的,它使用页级锁模式。?行锁:o查看地址为11348b328的行,其rowid为 0x102,表明这个锁是行锁,在这里为独占锁。这是针对t2的,它使用行级锁模式。? 数据库锁:o查看地址为10a3134d8的行,表上有一个行锁。不过,tblsnum 0x100002是一个数据库 tblspace ,它是在服务器中保持数据库列表的特殊表。因此,它行上的锁相当于锁定数据库。类型 S 表明该锁是一个共享锁。要在onstat -k,中找出tblsnum的表名,需要对systables表使用以下语句:清单12.识别tbslnum的表名10/13.SELECT * FROM systables WHERE partnum=1049072;Output:tabnamet2ownerinformixpartnum1049072tabid101rowsize4ncols1nindexes0nrows0.00created07/20/2009version6619137tabtypeTlocklevelRnpused0.00fextsize16nextsize16flags0sitedbnametype_xid0am_id0pagesize2048ustlowtssecpolicyid0protgranularity回页首在 s
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年高效节能供水井工程承包协议
- 小学心理健康教育发言稿10
- 八年级上册第四章《光的直线传播》说课稿
- 家具买卖合同范本模板
- 消防培训合同范本
- 2024房地产合作经营协议模板范例
- 2024年球墨铸铁行业政策分析:球墨铸铁行业标准推动重大技术装备
- 松鼠加盟合同范本
- 农业 施工 合同范本
- 2024年企业正式用工协议样式
- GH/T 1419-2023野生食用菌保育促繁技术规程灰肉红菇
- 鼻咽癌的放射治疗课件
- 明孝端皇后九龙九凤冠
- 注塑车间规划方案
- 营养不良五阶梯治疗
- 标本运送培训课件
- 护士与医生的合作与沟通
- GB 42295-2022电动自行车电气安全要求
- 产品系统设计开发 课件 第4、5章 产品系统设计类型、产品系统设计开发综合案例
- 1编译原理及实现课后题及答案
- 让阅读成为习惯家长会课件
评论
0/150
提交评论