• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase
您的位置:首页 > 数据库 >DB2 > DB2死锁的解决过程全记录

DB2死锁的解决过程全记录

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-11

通过本文主要向大家介绍了db2死锁,db2 查询死锁,db2 表死锁,db2查看死锁,存储过程死锁等相关知识,希望本文的分享对您有所帮助

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

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

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

1、因为生产环境数据量大,我们无法把生产环境中关联表的数据导入到测试环境。也就是说,无法模拟数据量。
2、没有任何log输出。因为生产环境的log输出级别是ERROR。
3、无法在生产环境进行测试,因为客户不允许。
4、生产环境的数据库无法开启快照等功能。因为会影响性能。

大家可以想象,在没有快照等功能下,分析死锁就只能靠分析代码了。但是这个处理非常复杂,单凭分析代码,没有任何头绪。
 
阶段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:使用画面操作去模拟
 
然后我们修改了程序,使用画面去操作,也成功地再现了这个死锁。
 
解决方案:
 
解决方案很简单,就是把查询语句中的条件加为索引,就不会出现死锁了。
由于这个表数据量不大,所以性能几乎没有任何影响。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • DB2死锁的解决过程全记录
  • DB2 for z/OS Web 应用程序死锁分析

相关文章

  • 2017-06-28DB2数据库SQL编码优化基础
  • 2017-06-28DB2发展:持续强化XML支持
  • 2017-06-28DB2 Web服务提供者的安全性(2)
  • 2017-06-28配置 DB2 pureScale 利用 DS8700 Metro Mirror 进行灾难恢复
  • 2017-05-11DB2常用傻瓜问题1000问(六)
  • 2017-06-28DB2 最佳实践: 使用 DB2 pureXML 管理 XML 数据的最佳实践,第 2 部分:向 DB2 数据库中添加 XML 数据指南
  • 2017-06-28DB2 Performance Expert 简化性能管理和调优(1)
  • 2017-06-28使用DB2look重新创建优化器访问计划(4)
  • 2017-06-28使用DB2look重新创建优化器访问计划(7)
  • 2017-06-28使用DB2look实用程序重新创建优化器访问计划

文章分类

  • MsSql
  • Mysql
  • oracle
  • MariaDB
  • DB2
  • SQLite
  • PostgreSQL
  • MongoDB
  • Redis
  • Access
  • 数据库其它
  • sybase
  • HBase

最近更新的内容

    • 提高商业智能环境中DB2查询的性能(2)
    • DB2 应用程序开发: 利用 DB2 Universal JDBC Driver 进行跟踪
    • 使用 DB2 Change Management Expert 进行数据库版本控制
    • DB2 9.5的数据库内存保护
    • Data Studio Administrator V1.2 中的数据保留和数据迁移
    • DB2 rollforward 命令使用详解
    • WPAR 的相关概念和 DB2 的配置
    • 浅谈IBM DB2的数据库备份与恢复
    • 利用 Oracle 10g 技能学习 DB2 9.1 for Linux, UNIX and Windows
    • DB2 数据库应用中使用受信任上下文

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有