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 --