2

我们如何更改 Progress 中的默认锁而不是 Share-lock?

4

2 回答 2

11

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

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

于 2009-08-24T17:50:24.973 回答
0

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

在 FOR-EACH 构造中,在BREAKorBY关键字之前执行此操作(by关键字类似于orderSQL 中的关键字),但在where子句之后:

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

如果使用 FOR-EACH 和附加的 EACH / FIRST / LAST 查询(假设表订阅 / 子表 MailSubscription),您可以设置每个子查询的级别。在此示例中,我需要浏览订阅记录,查找相关的 MailSubscription 记录,并编辑最终的、未注明日期的记录,在处理该记录时将所有其他记录排除在外,但将主子记录打开以供其他人编辑。

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

FIND FIRST TableName WHERE TableName.x > 10 AND TableName.y NO-LOCK NO-ERROR.

IF AVAILABLE TableName THEN DO:
  /* Do Code */
END.

您也可以互换NO-LOCK替换EXCLUSIVE-LOCK。我可能应该在这里引用关于强大/重大责任的引述,但如果您可以访问进度编辑器,那么您可能已经从您的管理员那里获得了它。注意安全。

如果您有足够新的 Progress 版本,我建议您进行在线备份。数据库意义上的在线不会因为在线备份而被删除,而不是云备份或任何东西。

于 2015-01-05T15:46:10.223 回答