软件开发死锁db2 9.7

这个DB2死锁我真的想不通

有A/B两张主从表,B从表里面对应A表的外键上有建了索引,事务1、2会同时查询、汇总B表里面的自身的部分数据,然后删除记录。
例如事务1查询、汇总B表里面的1~5笔记录,事务2查询、汇总B表里面的6~10笔记录,然后删除各自的这5笔数据。
但是在删除的时候,发生了死锁,当前锁模式为NS锁,请求X锁。

数据库版本:DB2 V9.7
由于特殊原因,关闭了CUR_COMMIT = DISABLE;
锁超时:15秒
死锁检测:10秒

环境变量设置:
DB2_SKIPINSERTED=ON
DB2_EVALUNCOMMITTED=ON
DB2_SKIPDELETED=ON

用DB2 V9.7的死锁监控,监控到的锁事件相关信息见附件SQL。

实在是想不通这个死锁是如何产生的,求教育。

附件:

附件图标LOCK_PARTICIPANT_ACTIVITIES.xlsx (98.92 KB)

参与21

19同行回答

ljbupcljbupc软件开发工程师上海安硕科技
回复 19# xmherz 我说的是开启参数后的那种顺序写法,不开启的时候会等待锁释放才能进行下一步。开启了不需要等待锁释放就进行下一步,所以容易死锁显示全部
回复 19# xmherz

我说的是开启参数后的那种顺序写法,不开启的时候会等待锁释放才能进行下一步。
开启了不需要等待锁释放就进行下一步,所以容易死锁收起
互联网服务 · 2014-07-24
浏览1272
xmherzxmherz测试工程师中软海晟
回复 15# ljbupc     DB2_SKIPINSERTED=ONDB2_EVALUNCOMMITTED=ONDB2_SKIPDELETED=ON开启了这几个参数。插入,查询,更新/删除,这么做是很容易导致死锁的,就算是ur级别也一样。:L 这几个参数是用来提高并发性的,会让锁等待更少发生,甚至可能因此产生丢失更新之类的问...显示全部
回复 15# ljbupc


    DB2_SKIPINSERTED=ON
DB2_EVALUNCOMMITTED=ON
DB2_SKIPDELETED=ON
开启了这几个参数。插入,查询,更新/删除,这么做是很容易导致死锁的,就算是ur级别也一样。

:L 这几个参数是用来提高并发性的,会让锁等待更少发生,甚至可能因此产生丢失更新之类的问题。收起
软件开发 · 2014-07-23
浏览1208
xmherzxmherz测试工程师中软海晟
回复 17# stevenluffy     后面又做了几次验证,发现只要把这句SQL去掉,换成别的方式取得数据,就不会死锁了。DB2这个锁实在搞不懂。SELECT m.FRM_CD as frmCd,s.LEAF_LEVEL_CD as leafLevelCd,s.EXPORT_FLAG as exportFlag,sum(s.WEIGHT) as weight FROM BU_SE_BU...显示全部
回复 17# stevenluffy


    后面又做了几次验证,发现只要把这句SQL去掉,换成别的方式取得数据,就不会死锁了。DB2这个锁实在搞不懂。
SELECT m.FRM_CD as frmCd,s.LEAF_LEVEL_CD as leafLevelCd,s.EXPORT_FLAG as exportFlag,sum(s.WEIGHT) as weight FROM BU_SE_BUYINVOICE_Temp_MAS m,BU_SE_BUYINVOICE_Temp_DETL s  WHERE m.DATA_STATE = ?  and m.BU_YEAR = ? and m.FRM_CD = ? and m.BUYINVOICE_Temp_MAS_ID= s.BUYINVOICE_Temp_MAS_ID  and s.DATA_STATE = ? and s.BACK_FLAG = ? GROUP BY m.FRM_CD,s.LEAF_LEVEL_CD,s.EXPORT_FLAG收起
软件开发 · 2014-07-23
浏览1182
回复 16# xmherz     能把新的那组sql 贴出来吗?显示全部
回复 16# xmherz


    能把新的那组sql 贴出来吗?收起
证券 · 2014-07-23
浏览1176
xmherzxmherz测试工程师中软海晟
回复 14# stevenluffy     谢谢你的建议,最后我们就是改变了SQL写法,将原来主从表关联查询数据,改成先获取主表ID,然后再根据主表ID查从表,这样就不会死锁了。    这是个很大的事务,需要保证所有数据一致性,因此也不能用UR级别。    只不过DB2的...显示全部
回复 14# stevenluffy


    谢谢你的建议,最后我们就是改变了SQL写法,将原来主从表关联查询数据,改成先获取主表ID,然后再根据主表ID查从表,这样就不会死锁了。
    这是个很大的事务,需要保证所有数据一致性,因此也不能用UR级别。
    只不过DB2的锁机制在这点上我觉得是个很大的BUG,为什么关联查询,就会把非自己的数据给NS锁掉了,希望改进啊。。。。收起
软件开发 · 2014-07-23
浏览1182
ljbupcljbupc软件开发工程师上海安硕科技
一般来说,查询后游标未关闭就插入/更新/删除,这么做并发是容易导致死锁的;需要先把查询游标关了。DB2查询也是有锁的,除非 ur查询,ur是意向锁,超级排他锁外无所谓DB2_SKIPINSERTED=ONDB2_EVALUNCOMMITTED=ONDB2_SKIPDELETED=ON开启了这几个参数。插入,查询,更新/删除,这么做是很容...显示全部
一般来说,查询后游标未关闭就插入/更新/删除,这么做并发是容易导致死锁的;需要先把查询游标关了。
DB2查询也是有锁的,除非 ur查询,ur是意向锁,超级排他锁外无所谓
DB2_SKIPINSERTED=ON
DB2_EVALUNCOMMITTED=ON
DB2_SKIPDELETED=ON
开启了这几个参数。插入,查询,更新/删除,这么做是很容易导致死锁的,就算是ur级别也一样。
插入的锁被持有,后面更新/删除会等待对方的插入锁释放。
可以试试,插入后commit,查询后关闭游标,然后再删除。
如果查询和更新的条件一致,也可以尝试把这几个参数关了,在查询时就先等待插入的锁,并发时就等待。
如果都是自己插入查询删除自己的,直接用session临时表吧,在自己的session里倒腾。收起
互联网服务 · 2014-07-23
浏览1178
xmherzxmherz测试工程师中软海晟
回复 12# stevenluffy     有什么方法可以避免吗显示全部
回复 12# stevenluffy


    有什么方法可以避免吗收起
软件开发 · 2014-07-22
浏览1201
回复 11# xmherz     如果是这样的话,死锁还是有可能的,因为是空表,所以插入信息后索引的信息无效,推测应该走表扫描。显示全部
回复 11# xmherz


    如果是这样的话,死锁还是有可能的,因为是空表,所以插入信息后索引的信息无效,推测应该走表扫描。收起
证券 · 2014-07-22
浏览1167
xmherzxmherz测试工程师中软海晟
回复 10# stevenluffy     这两张表一直都是空表,就我用的过程中,两个事务会往主表各插入1笔数据,从表各插入5表数据。    也就是说死锁发生时,主表有2表数据,从表有10笔数据。...显示全部
回复 10# stevenluffy


    这两张表一直都是空表,就我用的过程中,两个事务会往主表各插入1笔数据,从表各插入5表数据。

    也就是说死锁发生时,主表有2表数据,从表有10笔数据。收起
软件开发 · 2014-07-22
浏览1163
查看一下统计信息贴出来:select count(1) from BU_SE_BUYINVOICE_TEMP_MAS;select count(1) from BU_SE_BUYINVOICE_TEMP_MAS_PK;select tabname,card from syscat.tables where tabname in ('BU_SE_BUYINVOICE_TEMP_MAS','BU_SE_BUYINVOICE_TEMP_MAS_PK')显示全部
查看一下统计信息贴出来:
select count(1) from BU_SE_BUYINVOICE_TEMP_MAS;
select count(1) from BU_SE_BUYINVOICE_TEMP_MAS_PK;
select tabname,card from syscat.tables where tabname in ('BU_SE_BUYINVOICE_TEMP_MAS',
'BU_SE_BUYINVOICE_TEMP_MAS_PK')收起
证券 · 2014-07-22
浏览1425

提问者

xmherz
测试工程师中软海晟

相关问题

问题状态

  • 发布时间:2014-07-21
  • 关注会员:2 人
  • 问题浏览:10554
  • 最近回答:2014-07-24
  • X社区推广