首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >进程中的并发操作4GL

进程中的并发操作4GL
EN

Stack Overflow用户
提问于 2014-12-17 10:28:31
回答 1查看 333关注 0票数 0
代码语言:javascript
复制
REPEAT With FRAME:

  prompt-for IN-SCAN3.scan.
  if input IN-SCAN3.scan="" then Do:
    Message "please input date.". 
    undo,retry.
  end.
  else DO:
    FIND FIRST in-scan3 USING IN-SCAN3.scan NO-LOCK NO-WAIT NO-ERROR.
    if avail In-scan3 then DO:
        str="OK".
        display str.
        next-prompt IN-SCAN3.scan. 
    end.
    else DO:    
        CREATE In-scan3.
        ASSIGN IN-scan3.scan=INPUT in-scan3.scan.

        str="NO". DISPLAY str.
        next-prompt In-scan3.scan.
    END.
  end.
  begin=begin + 1.
end.

问题描述:有20个用户同时使用扫描,首先查找输入数据,如果没有找到,则在数据库中创建一条记录。问题是,在运行的同时会出现死锁。我尝试了NO-LOCK NO-WAIT with record,当查找时,操作会出现死锁。

谢谢你的回复。

EN

回答 1

Stack Overflow用户

发布于 2014-12-17 19:58:52

不幸的是,您与ABL的基本“陷阱”发生了冲突--记录锁定将缺省为SHARE-LOCK,即使您指定了共享锁,这可能不是您想要的。

基本规则是,如果您的事务作用域小于您的记录作用域,那么当您离开事务时,记录将回落为共享锁。但我建议您阅读ABL指南中的相关章节。

有很多方法可以解决这个问题。RELEASE关键字是一个。但我倾向于使用单独的缓冲区来实际锁定记录的想法。这样一来,你就可以让其他程序员看得很清楚。

例如:

代码语言:javascript
复制
def buffer b-in-scan3 for in-scan3.

repeat:
    prompt-for in-scan3.scan.

    /*** etc. ***/

    else
    do for b-in-scan3 transaction:
        find first b-in-scan3 using in-scan3.scan
            exclusive no-wait no-error.

        if  not avail b-in-scan3
        and not locked b-in-scan3
        then
        do:
            create b-in-scan3.
            b-in-scan3.scan = input in-scan3.scan.
        end.

     end.  /* of transaction */

 end. /* of repeat */

这样,如果另一个程序员在事务块之外使用b-inscan3,程序将无法编译,而不是开始返回到SHARE-LOCK。

请记住,您可以选中锁定和可用,但如果记录被锁定,则它不可用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27517431

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档