Prayer

在一般中寻求卓越
posts - 1256, comments - 190, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

911错不一定是死锁,怎么区分死锁和超时

Posted on 2012-03-01 10:53 Prayer 阅读(8373) 评论(0)  编辑 收藏 引用 所属分类: DB2
大家在开发、测试过程中,常见到程序报911这样的错,查看一下帮助:

d:/>db2 ? sql0911n


SQL0911N因为死锁或超时,所以当前事务已回滚。原因码为
          "<原因码>"。

解释:

当前工作单元涉及到未解决的对使用对象的争用,因此不得不回滚。

原因码如下:


 2 由于死锁而导致事务已回滚。

 68 由于锁定超时而导致事务已回滚。

 72 因为存在与事务中所涉及的 DB2 Data Links Manager
有关的错误,所以事务已回滚。

注释: 必须再次输入与工作单元相关的更改。

应用程序已回滚至上一次 COMMIT。

用户响应:

为了帮助避免死锁或锁定超时,对长时间运行的应用程序或有可能遇到死锁
的应用程序频繁发出 COMMIT 操作(如果有可能的话)。

联合系统用户:死锁可能发生在联合服务器或数据源上。没有检测跨越数据
源并潜在地跨越联合系统的死锁的机制。有可能标识使请求失败的数据源(
参阅 Problem Determination Guide 以确定哪一个数据源使 SQL
语句的处理失败)。

当处理 SQL 语句的某些组合时,通常会发生死锁或者预期会发生死锁。建议
您设计应用程序来尽可能避免死锁。

 sqlcode :  -911

 sqlstate :  40001


d:/>


很明显是两种原因可能造成这样的错误。
1、死锁
2、锁等待超时

怎么区分呢?

思路:
     根据原因码,如果是2就是死锁引起的;如果是68就是超时引起的。
     如果没有获得原因码,那么从系统自带的死锁监视器里确认是否发生过死锁,如果没有发生,则就是超时引起的。

超时解决办法:
     1、优化相关sql
     2、延长超时设置

死锁分析方法:
     用实例用户连接到db2实例,切换到死锁监视器路径下,运行db2evmon -path xxx >lock_rpt.txt来生成报告。


-- The End --


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理