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

2008-11-20    | |
打印本文章
RSS

导读:在本文中作者主要介绍了分析监控结果和避免死锁的方法。内容就是如何分析那些从死锁监控器得来的结果,以及采用相应的措施来避免死锁的发生。

关键词:DB2 UDB DB2 避免死锁 分析监控结果

正在加载数据...

分析监控结果

本节我们开始详细分析上一节产生的监控结果,从监控导出的日志文件中,我们可以分析出死锁发生的时间,级别,模式以及产生死锁的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)的使用实例,并且可以学会如何逐步地利用死锁事件监控器来监控死锁的发生,最后我门掌握的内容是如何分析那些从死锁监控器得来的结果,以及采用相应的措施来避免死锁的发生。


实例讲解如何在DB2 UDB中正确的监控死锁
 实例讲解如何在DB2 UDB中正确的监控死锁(一)
 实例讲解如何在DB2 UDB中正确的监控死锁(二)
 实例讲解如何在DB2 UDB中正确的监控死锁(三)

原文出处:http://tech.ccidnet.com/art/982/20080917/1573039_3.html
来源:赛迪网    作者:fen    
  评论
 
开放的DB2拥有先进的数据库技术,专为随需应变的统一信息平台而设计,它能够使您摆脱现有信息系统的禁锢,全面支持您随机应变的业务发展。它支持Unix、Linux以及……
 
使用IBM DB2数据库时必须了解的几个知识点:第一在安装DB2数据库后,你可以通过命令行方式或图形界面方式来操作;第二控制中心中无法增删改数据,只能编写sql语句……
 
在一次性导入大量数据到表中时,会因为写日志而影响性能,如何提高该操作的性能,在导入数据后,需要做更新统计操作,如何做?DB2中如何实现为一个DMS表空间……
 
如何对应SQLServer的InsertBulk命令?如何给VARGRAPHIC类型字段设置缺省值DB2存储过程中的异常处理如何写,与Oracle中的有何区别?针对上述问题作者在文中作了详细介绍。
 
CLP连接数据库服务器返回错误,提示codepage无法转换,按提示更改代码页后仍然无法连接。Solaris 5.8下用命令行方式无法连接数据库,提示遇到错……,这些问题怎么解决?
在SQL Server中,我们如何进行索引设计来提升系统的性能和对查询进行优化,是许多用户非常关注的问题,在本次技术专题中,我们将分群集索引和非群集索引设计两部分来为您详细分析。
本技术专题主要为使用Oracle SQL Developer和其他开发工具。包括如何使用Oracle SQL Developer和其他开发工具、使用Oracle Database Home Page、在Oracle中使用SQL*Plus等方面。
本专题为QL SELECT语句基础。侧重概述了如何使用SELECT来访问SQL数据库中所有内容以及组成SELECT语句的许多子句名称和功能;同时还阐述了如何使用DISTINCT关键字消除重复的行,以及如何正确使用ORDER BY子句来排序数据。
最新更新
专家答疑
技巧
Brian Fedorko
Oracle数据库审计功能十分强大、灵活并且易于配置,适当并有效地使用数据库审计功能是拥有高效安全策略的基础。
Brian Peasland
Oracle数据库二进制文件和库文件是高版本版本的,而备份的数据库内部如果仍然是较低版本,那么Oracle将不允许你打开数据库,除非你完成了升级过程。
Maria Anderson
在Windows XP环境下,使用数据库升级助手将Oracle从9.2.0.1升级到10g R2,出现DBUA不能识别Oracle数据库的SID问题如何解决。

登录TechTarget中国

关闭
本服务仅向TechTarget中国的会员开放,请登录或立即免费注册
登录Email
请输入您的登录Email
密码
下次自动登录