DB2死锁的解决过程全记录

来源:脚本之家  责任编辑:小易  

请教各位:DB2数据库里如何判断一个表被锁 1、执行命令打开锁的监视开光 UPDATE MONITOR SWITCHES USING lock on==>;>; 2、查看数据库的锁的情况 get snapshot for locks on tberp 3、某一个用户的锁的情况 get snapshot for application applid

生产环境里使用的数据库是DB2。但是最近频繁出现一个奇怪的死锁现象:某一个select sql 语句总是会出现死锁。

引起死锁的原因:互斥、占有且等待、非剥夺、循环等待 解决死锁的方法:预防死锁、避免死锁、检测并解除死锁

按照以往的经验,通常都是update/delete之类的更新sql语句会出现死锁的问题。而且这个 select sql 语句是一个很普通的sql,没有任何大数据量的处理。

产生死锁的原因:一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。 产生死锁的必要条件是:1、互斥条件;2、不可剥夺条件(不可抢占);3、部分分配;4、循环等待。 根据产生死锁的四个必要条件

分析这个死锁,有很多难以处理的地方。

这个选项一般在数据库数据同步时使用,即使用DB2的Replication center复制数据,启用此选项后DB2会将这个工具所需要的一些信息写入日志文件。

1、因为生产环境数据量大,我们无法把生产环境中关联表的数据导入到测试环境。也就是说,无法模拟数据量。

察看死锁 select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess where ao.object_id = lo.object_id and lo.session_id = sess.sid

2、没有任何log输出。因为生产环境的log输出级别是ERROR。

今天,我们来聊聊大连蛇岛!大连蛇岛在旅顺口区西北部的渤海中,距陆地最近处7海里。岛长约1500米,宽约800米,总面积约1.2平方公里。主峰海拔216.9米,四面多悬崖峭壁,唯东南角有一片卵石滩。岛上植物繁盛,达200余种。在林丛、石穴、山梁、阴谷等处,活动着1.3万条左右的蝮蛇,学名黑眉蝮蛇。春秋两季,是蝮蛇的采食季节,大量迁徙鸟类成为蛇类捕杀的猎物。基本信息中文名称大连蛇岛位置辽宁旅顺面积1.2平方公里海拔216.9米蛇岛形成原先这里不叫蛇岛,因为它还不是岛,是与大陆连接的一座座小山峰。这里是动物的乐园,冬天不冷夏天不热,常年空气湿润,小山上树木成林绿草成荫。这样好的地方当然是许多动物向往

3、无法在生产环境进行测试,因为客户不允许。

您好,这个不能一概而论,确实有一张就值20W左右的,但是也有一麻袋才10W的。下面小编就说说一张20W的老人民币拾圆工农像(大黑拾)在第二套人民币中,大黑拾已经成为名副其实的“大黑马”,一张纸币可以卖到二十万左右。下面小编说说一麻袋也大概只能卖个10W的第三版人民币,1953,一分带油纸币,800/捆,9000元/包,10万元/麻袋;小编继续把某网2017年8月份征收的价格表发转载在下面,希望可以帮助您,供您参考。第二版某网址2017年8月发布的收购价格单张(1张),整刀(100张),整捆(1000张),整包(10000张),整麻袋(100000张)壹分长号码8800全品整刀贰分长号码7600

4、生产环境的数据库无法开启快照等功能。因为会影响性能。

孙悦落选全运会之于北京来说,确实是一个损失,这种损失不只是说全运会缺少一个后场有实力的球员,另一方面,全运会也是北京队新赛季磨合的好机会。而对于孙悦来说,这一次没能入选全运会,也是他新赛季和北京队关系不睦的另一个信号。因为孙悦并不是体制内球员,所以他并没有为北京队打全运会的义务,如果出战全运会,那也是明码标价,双方会协商一个彼此能接受的价格。这种情况在全运会中并不少见。比如这次天津分别签了赵睿和赵岩昊,上届全运会辽宁签了巴特尔等等,这些都是雇佣关系,而非体制义务。鉴于孙悦上个赛季的表现以及他目前的态度,北京队不请他打全运会也是在情理之中,并不意外。以孙悦的实力,只要是态度没问题,他依然是北京队

大家可以想象,在没有快照等功能下,分析死锁就只能靠分析代码了。但是这个处理非常复杂,单凭分析代码,没有任何头绪。

对于这个问题,100个聪明的女人有100种答案。我很笨,反应很慢,可我感觉很幸福,所以可能觉得婚姻里女人还是不要那么聪明了。在家承认老公比我聪明,所以大事上我听他的安排,不操心也不与他争执,他自会安排妥妥的。家里其他小事情上,跟聪不聪明都没关系,只要我心情舒畅,一桌大餐一个人半天都能搞定。不算计正好闲下时间和头脑让自己发展兴趣爱好,跳舞瑜珈画画养花种草,活得悠闲自在。前几年老公还一直以为我是揣着明白装糊涂,后来才知道我是真笨,就是性格好,真诚得肯认错。然后他是真的不忍心欺负我了,对人对事和生活工作方方面面上开始手把手开始教导我。婚姻对于女人也算第二次投胎做人了,在他教导之下,我比过去确实更好一

 

阶段1:我们怀疑是数据量的原因

 

由于生产环境的数据量特别大,这个处理还有很多其他表的处理。所以我们怀疑是不是大数据量导致系统负荷过高,导致了死锁?

于是我们取得了发生死锁时CPU,硬盘,网络等等负载信息。没有找到任何线索。

 

阶段2:做一个测试程序,在测试环境中用多线程模拟多用户去做这个处理。

 

为了能够在开发环境再现出这个死锁,我们做了一个多线程的测试程序,模拟多用户运行。可惜,还是没有再现出来。

 

阶段3:分析测试环境数据库和产品环境数据库的差异

 

此时我们怀疑还是数据量导致的问题。于是我们尽可能的将开发环境的数据弄得和产品环境一样多。

之后在运行测试,还是没有再现出来。

 

阶段4:分析用户的操作log

 

没有任何办法的情况下,我们只好分析用户的操作log,希望从中找到一点线索。功夫不负有心人,我们发现,当两个人同时

进行这个操作的时候,基本都会发生死锁。所以,我们判断还是两个人同时操作导致的问题。但是,为什么开发环境上模拟了

很多人的操作,却没有发生死锁呢?

 

阶段5:发现数据库设置的问题

 

我们又修改了测试程序,将模拟的用户数量提高,但是很不幸,仍然没有再现这个问题。此时我们注意到了:是不是开发环境的

数据库设置和产品环境的数据库设置不同?我们对比了一下两个数据库的设置:发现好多参数不同。但是我们仅仅关注了和锁有关

的设置,也就是包含 LOCK关键字的设置。

 

阶段6:将测试环境数据库和产品环境数据库的设置保持一致

 

我们将所有和lock有关的设置都改成了和产品环境一直。但是仍然没有再现这个死锁。终于,一个人发现,"cur_commit"这个设置

不同。于是查询文档,发现了 cur_commit的特点。

当 cur_commit = false的时候,下列情况会造成死锁:

线程1插入数据A,然后线程2插入数据B。

在线程2还没有提交事物之前,线程1查询数据A,就会造成死锁了。

开发环境中,cur_commit = true,所以我们一直也模拟不出来这个现象。

于是,我们把cur_commit也改成了 false。

 

阶段7:使用测试程序去模拟

 

我们修改了测试程序,模拟上面两个线程的操作,成功地再现了这个死锁。错误的log信息和产品环境上也是一致的。

 

阶段8:使用画面操作去模拟

 

然后我们修改了程序,使用画面去操作,也成功地再现了这个死锁。

 

解决方案:

 

解决方案很简单,就是把查询语句中的条件加为索引,就不会出现死锁了。

由于这个表数据量不大,所以性能几乎没有任何影响。

扩展阅读,根据您访问的内容系统为您准备了以下内容,希望对您有帮助。

db2存储过程执行表和存储过程就死锁怎么处理

1、建议获取snapshot for application 以及snapshot for locks,应可以确定是哪一句发生了锁。

2、如果能肯定是这一句,如果可以直接在最后加上 with ur应该就可以了(如果业务逻辑容许的话)。

DB2如何解决并发锁表问题

先定位一下是哪个程序句柄导致的死锁。

方法一、查看db2diag.log文件

找到DeadLock or Lock timeout 死锁或锁超时信息

db2 force application(句柄ID)

直接结束进程即可。

方法二、DB2快照信息

1、看一下DB2快照信息

db2 get snapshot for locks on sample

可以得到类似信息:

数据库锁定快照

数据库名称 = SAMPLE

数据库路径 = D:\IBM\DB2\NODE0000\SQL00001\

输入数据库别名 = SAMPLE

挂起的锁定 = 8

当前已连接的应用程序 = 2

当前正等待锁定的代理程序数 = 1

应用程序句柄 = 54

应用程序标识 = *LOCAL.DB2.140304192925

序号 = 00001

应用程序名 = db2bp.exe CONNECT

授权标识 = DB2ADMIN

应用程序状态 = 锁定等待

应用程序代码页 = 1208

挂起的锁定 = 4

总计等待时间(毫秒) = 247867

锁定列表

锁定名称 = 0x5359534C564C3031DDECEF2841

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 2312

对象类型 = 行

表空间名 = IBMDB2SAMPLEREL

表模式 = DB2ADMIN

表名 = TEST

方式 = IX

查看锁定的详细信息:db2 get snapshot for locks for application agentid 1728

----(1728是句柄ID)

3、观察命令db2 list applications的输出

查看应用程序的状态是否有锁定等待(Lock-wait)状态出现。

执行命令 list applications for db sample show detail;

4、db2 force application(句柄ID)

直接结束进程即可。

db2 如何查看死锁的详细信息

db2 list applications show detail | grep -i lock

如果是Windows系统,grep命令不好用,你就用list applications命令然后仔细找吧,找到后可以用get snapshot for application命令获得快照,然后可以知道是谁hold了锁,你就能顺利解锁了追问不过那锁不一定是死锁,还可能是其他类型的锁,我已经找到方法了,不过还是谢谢啊

DB2数据库发生死锁了怎么办

db2 get snapshot for locks on sample

db2 get db cfg for sample

db2 update db cfg using dlchktime 10000

-查看数据库管理器级别快照信息

db2 get snapshot for dbm

-查看数据库级别快照信息

db2 get snapshot for database on dbname

-查看应用级别快照信息

db2 get snapshot for application agentid appl-handler

注:appl-handler可以从list applicaitions的输出中得到

-查看表级别快照信息

db2 get snapshot for tables on dbname

注:需要把tables快照开关设为ON才会有作用

-查看锁快照信息

db2 get snapshot for locks on dbname

db2 get snapshot for locks on for application agentid appl-handler

-查看动态sql语句快照信息

db2 get snapshot for dynamic sql on dbname

db2 get monitor switches

db2 update monitor switches using lock on statement on

create event monitor mymonitor for deadlocks,statements write to file 'c:/temp'

set event monitor mymonitor state 1

db2evmon - path 'c:/temp'

--转自:http://blog.csdn.NET/rodjohnsondoctor/article/details/4323514

---

第1页:上线前的准备

第2页:维护时的注意事项

第3页:发生死锁后的对策

【IT168 技术文档】在新的数据库应用系统上线初期,由于测试不完善或不熟悉DB2的机制,常会出现锁等待死锁等现象存在于我们的应用系统中,如何捕获锁等待或死锁信息并解决锁问题,是保证平稳上线必须面对的问题。目前应用系统最常使用的DB2数据库版本有多个,有8.1,8.2,9.1还有新推出的9.5,对于不同版本的DB2数据库提供的解决办法不尽相同,下面对于上述问题的解决作了一个简单说明,希望对大家有用。

首先在上线前有几件跟锁相关的事情需要开发设计人员一定要做好

1. 相关参数的更改

注册表变量参数:

DB2_EVALUNCOMMITTED=on 当启用此变量时,在可能的情况下,它将进行表或索引访问扫描以延迟或避免行锁定,直到知道数据记录满足谓词求值为止。

DB2_SKIPDELETED=on 当启用此变量时,在可能的情况下,它允许使用无条件地跳过已删除的键或跳过已删除的行。

DB2_SKIPINSERTED=on 当启用此变量时,在可能的情况下,它允许跳过未落实的已插入行,就好像从未插入这些行一样。

数据库参数:

LOCKLIST 锁定列表的内存量,当此参数设置为 AUTOMATIC 时,就启用了自调整功能。这允许内存调整器根据工作负载需求变化动态地调整此参数控制的内存区大小。如果不是自动,需要设置相对大一些;DB2默认是行锁,每个行锁大约占64或128个字节(64位数据库),计算锁定列表内存的大小公式是: ( 每个应用程序的平均锁定数目的估计值 * 每个锁定所需的字节数(128或64) * maxappls(或者max_coordagents) /4096 ) * 120%,这里只是建议公式,实际情况还要视操作系统实际的内存量来定。

MAXLOCKS 升级前锁定列表的最大百分比,默认是22%(windows)或10%(unix),可以根据要求自行改动,计算公式是 2 * 100 / maxappls

DLCHKTIME 死锁检测时间间隔,默认是10000毫秒(10秒),可以根据要求自行改动,也可不动。增大此参数以降低检查死锁的频率,因此增加应用程序必须等待消除死锁的时间。 减小此参数会增大检查死锁的频率,从而减少应用程序必须等待死锁解决的时间,但是会增加数据库管理器检查死锁所花的时间。

LOCKTIMEOUT 锁等待时间,默认是 -1,也就是永远等待,请改成固定的值,在事务处理(OLTP)环境中,可以使用 30 秒的初始启动值。在一个只查询的环境中,您可以从一个较高的值开始。

LOGFILSIZ 日志文件大小,此参数定义每个主日志文件和辅助日志文件的大小。如果数据库要运行大量更新、删除或插入事务,而这将导致日志文件很快变满,则应增大日志文件,了解您的并发应用程序的日志记录需求,来确定一个不会分配过量而浪费空间的日志文件大小。

LOGPRIMARY 主日志文件数,了解您的并发应用程序的日志记录需求,适当增大日志文件数。

注意: 在更新参数时,需要注意有些参数在更改后需要重新启动数据库DB2实例才可以生效;有些参数需要断开当前所有的应用程序,重新链接才能生效;有些参数可以立即生效,使用者请参考相关文档,注意参数生效特性。

2. 应用程序设计

-程序尽量短小精悍

-程序尽量晚地访问关键资源

-程序尽可能快地提交工作

-程序尽可能快地关闭游标

-建立合适索引

3. 性能测试

要根据将来实际的并发用户数和数据量进行测试

上线之后维护时我们要做的几件事情

1. 做好定期维护

通过使用如下命令进行维护:

-reorg表和索引定期重组

-runstats表和索引的统计信息定期更新

-rebind 程序包定期重新编译

db2 怎么查死锁.怎么杀掉死锁进程

C:\>db2 get snapshot for locks on js

数据库锁定快照

数据库名称 = JS

数据库路径 = D:\DB2\NODE0000\SQL00001\

输入数据库别名 = JS

挂起的锁定 = 5

当前已连接的应用程序 = 1

当前正等待锁定的代理程序数 = 0

快照时间戳记 = 2007-09-04 12:54:33.121513

应用程序句柄 = 10

应用程序标识 = *LOCAL.DB2.070904045330

序号 = 00001

应用程序名 = db2taskd

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态 = 连接已完成

状态更改时间 = 未收集

应用程序代码页 = 1208

挂起的锁定 = 0

总计等待时间(毫秒) = 未收集

应用程序句柄 = 9

应用程序标识 = *LOCAL.DB2.070904045329

序号 = 00001

应用程序名 = db2stmm

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态 = 连接已完成

状态更改时间 = 未收集

应用程序代码页 = 1208

挂起的锁定 = 0

总计等待时间(毫秒) = 未收集

应用程序句柄 = 8

应用程序标识 = *LOCAL.DB2.070904045327

序号 = 00011

应用程序名 = javaw.exe

CONNECT 授权标识 = ADMINISTRATOR

应用程序状态 = UOW 正在等待

状态更改时间 = 未收集

应用程序代码页 = 1208

挂起的锁定 = 5

总计等待时间(毫秒) = 未收集

锁定列表

锁定名称 = 0x020010000D0080080000000052

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 142606349

对象类型 = 行

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = X

锁定名称 = 0x02001000090080080000000052

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 142606345

对象类型 = 行

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = X

锁定名称 = 0x01000000010000000100EA0056

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 0

对象类型 = 内部变化锁定

方式 = S

锁定名称 = 0x5359535348323030DDECEF2841

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 1

挂起计数 = 0

锁定对象名 = 0

对象类型 = 内部方案锁定

方式 = S

锁定名称 = 0x02001000000000000000000054

锁定属性 = 0x00000000

发行版标志 = 0x40000000

锁定计数 = 2

挂起计数 = 0

锁定对象名 = 16

对象类型 = 表

表空间名 = USERSPACE1

表模式 = JS

表名 = US_CATALOG

方式 = IX

C:\>db2 list applications

授权标识程序 应用程序名 应用程序句柄 应用程序标识 数据库名称 代理序号

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

ADMINIST db2taskd 10 *LOCAL.DB2.070904045330 JS 1

ADMINIST db2stmm 9 *LOCAL.DB2.070904045329 JS 1

ADMINIST javaw.exe 8 *LOCAL.DB2.070904045327 JS 1

在snapshot的第四段显示应用程序句柄为8的应用有锁存在,在其相应的锁定列表中显示锁定的表是US_CATALOG。

如果您确定是US_CATALOG表上发生了死锁,可以通过命令db2 "force application(8)"来杀掉该应用在数据库上

的连接。注意如果force命令导致该应用的事务回滚得话,force命令不能马上断开应用在数据库上的连接,而是

要等到回滚完成后才能断开该应用的数据库连接。

C:\>db2 list applications show detail

//list applications for database cmsbj3 show detail

如果DB2在Window上,则可以使用“控制中心”->实例->右键“应用程序”,可以看到当前的锁定情况,并且可以强行关闭某个进程,也可以显示“锁定链”。

1.DB2表锁定怎么解锁

http://www.chinaunix.net/jh/22/20020.html

2.DB2中怎么知道表的锁定情况:

http://www.chinaunix.net/jh/22/16766.html

  • 本文相关:
  • 数据库触发器db2和sqlserver有哪些区别
  • centos下db2数据库安装过程详解
  • db2数据库常用操作命令大全
  • db2新手使用的一些小笔记:新建实例、数据库路径不存在、客户端连接 .
  • db2 导入导出单个表的操作详解
  • db2比较常用与实用sql语句总结
  • db2 常用命令小结
  • db2 常用命令速查(备忘)
  • db2 日期和时间的函数应用说明
  • 详解db2 sqlstate 57016 sqlcode=-668 原因码 "7"错误的快速解决办法
  • db2 自动递增字段实现方法
  • db2常用傻瓜问题1000问(四)
  • ibm db2 日常维护汇总(二)
  • db2中的数据移动(一)
  • db2常用傻瓜问题1000问(六)
  • 如何安装sql server 2008 management studio express
  • db2 常用命令小结
  • db2数据库中常见的堵塞问题分析与处理方法
  • ibm db2 日常维护汇总(四)
  • db2 select语句高级用法
  • db2存储过程执行表和存储过程就死锁怎么处理
  • DB2如何解决并发锁表问题
  • db2 如何查看死锁的详细信息
  • DB2数据库发生死锁了怎么办
  • db2 怎么查死锁.怎么杀掉死锁进程
  • db2数据库里面的一张表被锁定,怎么解锁
  • 试述死锁产生的原因和解决办法
  • 死锁怎么解决?
  • 求db2 中死锁和锁定超时的区别
  • 数据库死锁,怎样解决
  • 免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved