2016-09-16 57 views
0

我有一個用例,我從表中讀取一組記錄,對它執行一些操作,然後更新記錄。我希望在此期間沒有其他應用程序/組件能夠讀取記錄。這是因爲我想在多臺主機上運行相同的應用程序以獲得可伸縮性,但不希望發生競態條件。我的應用程序使用一些SQS更改事件並將它們應用於Oracle商店。請建議使用什麼機制。 SELECT FOR UPDATE將在這種情況下工作嗎?Oracle Java - 如何鎖定一行以便其他進程無法讀取它?

回答

2

選擇更新鎖定行並保留它以供您更新,但不會阻止他人閱讀它。我想你可能想重新考慮這個想法。想象一下,根據有多少人正在查看某些數據,整個表中的所有報表或所有查詢都有不一致的數字,無論他們是否決定更新數據?

或者,如果其他用戶查詢但無法看到該行 - 他們是否會試圖插入它,並且您要麼達到唯一的鍵約束或處理重複的數據?或者,如果我查詢了一次並查看它,然後重新查詢,並且因爲其他人查詢它而消失 - 我將擁有該應用程序多少信心?

當有人去度假時會發生什麼,但忘記關閉應用程序 - 爲其他人留下一個「失蹤」行一週?

你可能想研究樂觀鎖定來處理競爭條件。是的,這是實施的工作,但要比提供不一致結果的應用程序更好!或者,您可以使用兩種模式來顯示和編輯屏幕。用戶點擊「編輯」,然後重新獲取FOR UPDATE,執行編輯,然後提交更改或放棄編輯。然而,這種技術的用處不大,因爲如果事務沒有解決,可能需要DBA干預才能解決,它通常會留下行或甚至整個表被鎖定。

相關問題