免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 15665 | 回复: 26

程序死锁典型案例分析 [复制链接]

论坛徽章:
0
发表于 2009-11-23 11:30 |显示全部楼层
某系统分析员对对程序员甲和乙说,我们要开发一个库存系统。
如果收货,我们要更新两个文件:
1)库存文件ITEM_MST,更新收货量 I_REC,
2)批号文件LOT_MST,更新收货量  L_REC。

如果发货,我们也一样要更新同样两个文件:
1)库存文件ITEM_MST,更新发货量 I_ISSUE,
2)批号文件LOT_MST,更新发货量。L_ISSUE。

程序员甲负责收货程序开发,程序员乙负责发货开发。

于是程序员甲开发了收货子程序, 看来像下面那样(略去无关紧要的部分,假定纪录总是存在)


C     GOOD_REC   BEGSR
C     SKU               CHAIN ITEM_MST
C     LOT               CHAIN LOT_MST
C                          EVAL I_REC += R_QTY
C                          EVAL L_REC += R_QTY
C                          UPDATE LOT_REC
C                          UPDATE_ITEM_REC
C                          ENDSR



而程序员乙的开发的发货子程序看来像下面那样(略去无关紧要的部分,假定纪录总是存在)

C     GOOD_ISSUE   BEGSR
C     LOT                  CHAIN LOT_MST
C     SKU                  CHAIN ITEM_MST
C                             EVAL L_ISSUE += I_QTY
C                             EVAL I_ISSUE += I_QTY
C                             UPDATE LOT_REC
C                             UPDATE ITEM_REC
C                             ENDSR

程序测试均没有发现问题。
可是一旦发给大量用户使用,就发生了死锁的问题。

请大家分析死锁的原因,讨论解决的方法。

[ 本帖最后由 franliu 于 2009-11-23 13:00 编辑 ]

论坛徽章:
0
发表于 2009-11-23 12:37 |显示全部楼层
是不是应该做一个排他处理呀,防止多个用户同时更新一条数据

论坛徽章:
0
发表于 2009-11-23 12:52 |显示全部楼层

回复 #2 4321258sun 的帖子

你读懂了没有程序是怎样死锁的?注意一定要有两个或者以上的用户同时争夺系统某一资源(这里是纪录),死锁才会发生。

其实这个程序只要稍微加以改动,就可以安全地在多用户环境里面安全地运行。

[ 本帖最后由 franliu 于 2009-11-23 13:03 编辑 ]

论坛徽章:
0
发表于 2009-11-23 13:19 |显示全部楼层
C     GOOD_ISSUE   BEGSR
C     LOT                  CHAIN LOT_MST
C                             EVAL L_ISSUE += I_QTY
C                             UPDATE LOT_REC
C     SKU                  CHAIN ITEM_MST
C                             EVAL I_ISSUE += I_QTY
C                             UPDATE ITEM_REC
C                             ENDSR

论坛徽章:
0
发表于 2009-11-23 13:36 |显示全部楼层

回复 #4 insmile 的帖子

对了!菜鸟们千万要记得除非必要,不要同时锁住太多的纪录, 不然你写的程序很可能只有在你独霸系统的时候才能够顺利完成。

上面的例子是简化的典型例子。实际上通常的应用程序源代码长达成千上万行。要看出来其中奥妙需要花蛮长的时间。

不过死锁的“pattern” 都是一样的。那就是:

作业甲锁住资源a, 同时等待乙作业释放资源b

作业乙锁住资源b, 同时等待作业甲释放资源a

这样死锁就发生啦。

[ 本帖最后由 franliu 于 2009-11-23 14:06 编辑 ]

论坛徽章:
0
发表于 2009-11-23 15:18 |显示全部楼层

回复 #1 franliu 的帖子

如果有两个人同时使用就可能会出现死锁,可是你得根据具体的业务作修改,否则还是不行的阿..!

论坛徽章:
0
发表于 2009-11-23 16:45 |显示全部楼层

回复 #6 huangxkst 的帖子

你要学习四楼的改法。这样改既不影响程序逻辑,又解决了死锁的问题。

看来你还没有完全读懂我那样板程序中死锁是如何发生的。

论坛徽章:
0
发表于 2009-11-23 21:42 |显示全部楼层

回复 #7 franliu 的帖子

关键你的程序本来就可能出现这种加锁...

论坛徽章:
0
发表于 2009-11-24 00:34 |显示全部楼层

回复 #8 huangxkst 的帖子

这个程序是一个典型的有问题的程序样板,我拿来给大家分析死锁原因的。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2015-08-03 06:20:00
发表于 2009-11-24 13:15 |显示全部楼层
在RPG400里,对F表里设置为update操作的表,CHAIN可以用参数N如下 ,在LenDH的D位置下面输入N表示当前CHAIN操作不锁记录,在紧跟update之前才去用普通CHAIN去lock 记录,同时锁记录的CHAIN结果指示器做判断增加异常处理。
RPGLE里这个怎么实现还请大侠们指教。
CL0N01N02N03Factor1+++OpcdeFactor2+++ResultLenDHHiLoEqComments+++++++
C                     CHAIN

[ 本帖最后由 tomroom 于 2009-11-24 13:17 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP