更改正在进行的默认锁定而不是共享锁定

时间:2009-08-22 15:23:27

标签: progress-4gl

我们如何更改正在进行的默认锁定而不是共享锁定?

2 个答案:

答案 0 :(得分:11)

您可以通过使用[NO | EXCLUSIVE | SHARE] -LOCK修饰符向查询添加锁定状态来更改每个单独的查询(FIND,FOR EACH等)。如果您将其关闭,则会获得默认的SHARE-LOCK。

您还可以在使用-NL参数启动的会话中编译代码,该参数会将该r代码的默认值更改为NO-LOCK。

答案 1 :(得分:0)

如果我理解正确,Progress 4GL NO-LOCK类似于TSQL命令WITH(NOLOCK)。我们的想法是尽可能快地获取尽可能多的记录,并且您希望避免使用SHARE-LOCK为您不打算编辑的记录带来的资源争用。现在,在TSQL中,警告您可能会错过在执行TSQL查询时发生的编辑;我不确定这是否适用于Progress 4GL / ABL。我熟悉Progress 9和OpenEdge 10/11。进步专家,如果我离这里太远,请纠正我。我对此还是有点新鲜。

在FOR-EACH构造中,在BREAKBY关键字之前执行此操作(by关键字与SQL中的order类似),但在{ {1}}条款:

where

如果使用带有附加EACH / FIRST / LAST查询的FOR-EACH(假设表订阅/子表MailSubscription),则可以设置每个子查询的级别。在这个例子中,我需要浏览订阅记录,查找相关的MailSubscription记录,并编辑最终的,未结束的记录,在处理它时保留所有其他记录,但保留主子记录以供其他人编辑。

FOR EACH TableName
  WHERE TableName.x > 10
    AND TableName.y
  NO-LOCK BREAK BY TableName.x:
  /* Do Code */
END.

在FIND-FIRST / FIND-LAST构造中,在where之后和NO-ERROR之前(假设您正在使用IF-AVAILABLE构造)。请记住,如果您需要从同一个表中获取两个不同的记录,请至少为其中一个记录定义一个缓冲区。

  FOR EACH Subscription
    WHERE ProductID = 'DB'
      AND Subscriber
      AND GetsPaper
   NO-LOCK,
   LAST MailSubscription OF Subscription 
     WHERE MailSubscription.EndDate = ?
   EXCLUSIVE-LOCK
   BREAK BY Subscription.SubscriptionID:
     /* Fix broken MailSubscription records */
  END.

您也可以互换FIND FIRST TableName WHERE TableName.x > 10 AND TableName.y NO-LOCK NO-ERROR. IF AVAILABLE TableName THEN DO: /* Do Code */ END. 替换NO-LOCK。我应该在这里引用一篇关于强大功能/重大责任的报价,但是如果你有权访问Progress编辑器,你可能已经从管理员那里得到了它。注意安全。

如果您有足够新的Progress版本,我建议使用在线备份。在线意义上的在线并不是因为在线备份,而是云备份或其他任何东西。