我们如何更改正在进行的默认锁定而不是共享锁定?
答案 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构造中,在BREAK
或BY
关键字之前执行此操作(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版本,我建议使用在线备份。在线意义上的在线并不是因为在线备份,而是云备份或其他任何东西。