Progress-Database
Select 語句正在鎖定一條記錄
我們有一個從進度表中選擇記錄的過程,然後針對該記錄發布更新。
如果我們不進行選擇,那麼更新會全天執行。如果我們進行選擇,那麼更新就會超時。
選擇查詢非常簡單,如下所示:
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 字母鍵、“名字”、“姓氏”。 結尾。