Progress-Database

Select 語句正在鎖定一條記錄

  • May 6, 2014

我們有一個從進度表中選擇記錄的過程,然後針對該記錄發布更新。

如果我們不進行選擇,那麼更新會全天執行。如果我們進行選擇,那麼更新就會超時。

選擇查詢非常簡單,如下所示:

select fg."alphakey", n."first-name", n."last-name"
from pub.name n
inner join pub."family-guardian" fg
 on (fg."name-id" = n."name-id")
where fg."alphakey" = 'somevalue'

我們已經確認,如果上述聲明不存在,那麼它是有效的。但是,如果存在上述語句,則UPDATE失敗。更新違反了名稱表。不幸的是,我沒有該程式碼,因為它是通過第三方執行的。

兩個問題:

  • 這是正常的進步嗎?
  • 解決此問題的最佳方法是什麼?

如果在這種情況下臟讀不是問題,您可以嘗試表提示 readuncommitted 或 nolock..

pub.name n WITH(NOLOCK)

join pub.[family-guardian] fg WITH(NOLOCK)

使用 4GL

我認為解決此鎖定問題的最佳方法是使用 4GL(有時稱為 ABL)。在 4GL 中,神奇的命令是NO-LOCK,您可以在每個 table where 子句之後使用它。遺憾的是,4GL 不支持方便連接的 SQL 快捷方式名稱。也就是說,如果您的索引定義正確,則**EACH … OF語法會取代它。**如果沒有,只需刪除 OF 並將您的條件放在 where 子句中。只需為較慢的執行做好準備。

對於每個 pub.name
無鎖,
每個 pub."family-guardian" OF pub.name
WHERE alphakey = 'somevalue'
無鎖:
DISP 字母鍵、“名字”、“姓氏”。
結尾。

引用自:https://dba.stackexchange.com/questions/24820