首页产品库评测行情新闻|手机数码笔记本台式机DIY硬件数字家庭数码相机办公外设|软件下载游戏开发|社区

更多

数码相机
MP4
LCD
机箱
音箱

软件资讯设计 工具 系统 开发 安全 办公 陶吧 IT教育 Vista频道 | 下载中心酷我音乐盒 腾讯QQ
天极网 > 开发频道>实例讲解如何在DB2 UDB中正确的监控死锁

实例讲解如何在DB2 UDB中正确的监控死锁

2008-01-16 09:23作者:佚名出处:论坛整理责任编辑:方舟

  分析监控结果

  本节我们开始详细分析上一节产生的监控结果,从监控导出的日志文件中,我们可以分析出死锁发生的时间,级别,模式以及产生死锁的SQL语句,从而据此来进一步地修正可能由程序并发设计或者数据库设计所导致的缺陷。

  ---------------------------------

  EVENT LOG HEADER Event Monitor name:

  DLMON Server Product ID: SQL08022…… Server instance name: DB2

  --------------------------------------

  --------------------------------------

  Database Name: SAMPLE Database Path:

  C:\DB2\NODE0000\SQL00001\ ……------------------3)

  Deadlock Event ... Deadlock ID: 1 ……4)

  Connection Header Event ... Appl Handle: 949 ……5)

  Deadlocked Connection ... Deadlock ID:

  1 Participant no.:

  2 Participant no. holding the lock: 1 Appl Id:

  G9B56A72.HE13.01B406083205 Appl Seq number: 0001

  Appl Id of connection holding the lock:

  G9B56A72.HD13.02CE06083152 …… Deadlock detection

  time: 2006-01-06 16:34:27.327582 Table of lock waited on:

  EMPLOYEE (A锁发生的表) Schema of lock waited on:

  JT Tablespace of lock waited on : USERSPACE1

  Type of lock: Row (A锁级别为行锁) Mode of lock:

  X - Exclusive (A锁模式为排他锁) Mode application

  requested on lock: NS - Share (and Next Key Share)

  (在A排他锁上要求B共享锁,发生死锁) ……Text:

  select name from employee(产生B共享锁的SQL语句)

  List of Locks: (当前所有锁的列表)…… Lock Name

  : 0x020005000D0000000000000052 Lock Attributes: 0x00000008

  Release Flags : 0x40000000 Lock Count

  : 1 Hold Count : 0 Lock Object Name

  : 13 Object Type : Row Tablespace Name: USERSPACE1

  Table Schema : JT Table Name

  : PROJECT Mode : X - Exclusive

  (在PROJECT表上有一个排他锁)…… Lock Name:

  0x02000300000000000000000054 Lock Attributes:

  0x00000000 Release Flags: 0x00000001 Lock Count

  : 1 Hold Count : 0

  Lock Object Name : 3 Object Type:

  Table Tablespace Name: USERSPACE1 Table Schema:

  JT Table Name: EMPLOYEE Mode

  : IS - Intent Share(在EMPLOYEE表上有一个共享锁)

  Locks Held: 6 Locks in List: 6……9) Table Event...

  Table schema: JT Table name: EMPLOYEE Record

  is the result of a flush: FALSE Table type: User

  Data object pages: 1…… Rows read: 35 Rows written:

  1 …… Tablespace id: 2 Table event timestamp:

  2006-01-06 16:37:28.972501 (记录EMPLOYEE表上发生的事件)

  我们可以分析一下dllog1.txt 文件,来准确定位死锁发生的原因,看看5)Deadlocked Connection: 我们可以看出死锁发生的表是EMPLOYEE,同时我们也可以判断出这是一个对于已被排他锁占有的资源申请共享锁所导致的死锁。更加重要的是我们得到了产生死锁的SQL语句,从上面我们可以推断出一定存在别的应用程序在以独占锁的方式占用EMPLOYEE表,这很有可能就是对于EMPLOYEE表的插入或者更新动作造成的。

  而这最有可能就是插入或者更新事务时间过长所导致的,导致事务时间过长的原因大体有两种,一是来自于并发程序的设计和编写,二是来自于数据库的设计和数据库参数的调整。

  本节我们通过仔细地分析事件监控器的结果来推断出导致死锁发生的原因,从而采取有效的措施去避免死锁的发生。这些措施包括调整数据库参数,或者修改应用程序的代码,或者修改SQL语句甚至是数据库的设计来提高代码和SQL语句执行的效率。

  避免死锁的方法

  越早地考虑数据库设计中的并发性问题,就越可以提高代码执行的效率,降低程序开发和维护的成本,这里我们提出了一些避免死锁,提高应用程序并发性的方法。

  设置隔离级别,根据应用程序的业务逻辑和数据完整性需求来决定合适的隔离级别,包括:RR,RS,CS,UR。该决定需要对应用程序需求和相关的业务规则具有基本理解

  尽量避免锁升级,正确调整参数LOCKLIST, MAXLOCKS

  SQL0911N返回码68(LOCKTIMEOUT参数)的原因是锁等待超时,而SQL0911返回码2(DLCHKTIME参数)的原因则是因为死锁被强制回滚,避免这两种错误的方法就是合理设计数据库和建立合理的索引

  尽快提交事务,不要在事务中加入不必要的执行时间过长的代码,比如大的代码循环和远程调用,或者一些没有用处的SELECT语句

  应用程序的框架实现保证一旦发现SQL错误,立刻执行回滚事务,释放锁。

  如果多个应用程序访问同一资源,最好以相同的次序访问。这样,即使前一个访问资源的应用程序会延迟其他应用程序的访问,也不会导致死锁的发生

  设定外键索引,如果想删除父表中的行,就需要扫描多个子表中的多行数据,这样就需要占用多个子表的锁,我们可以通过在外键上建立索引来减少扫描子表的行数,否则若不建立索引,如果从父表中删除一行的时候,就需要扫描整个子表。

  总结

  在我门完成这个例子的实际过程中,大家可以看到不同DB2工具(DBC CLI, SQL, DB2EVMON)的使用实例,并且可以学会如何逐步地利用死锁事件监控器来监控死锁的发生,最后我门掌握的内容是如何分析那些从死锁监控器得来的结果,以及采用相应的措施来避免死锁的发生。

共3页。 上一页123
进入 最权威的Windows 7论坛 查看网友讨论

软件频道最新更新

热点推荐

IT嘉年华

编辑推荐

软件下载

热门
推荐

网友关注

软件
资料
游戏

装机推荐

文章排行

本周
本月
最新更新
天极服务|关于我们|About us|网站律师|RSS订阅|友情合作|加入我们|天极动态|网站地图|意见反馈|MSN/QQ上看天极
Copyright (C) 1999-2012 Yesky.com, All Rights Reserved 版权所有 天极网络