我需要更新Oracle數據庫中的一行,但我不會在我的基於Web的應用程序中靜默地闖入其他客戶端的更改。選擇和更新之間的競爭條件
在我目前的系統I執行以下操作:
SELECT * FROM table WHERE id=:ID AND lastmodified=:LASTMOD
如果行仍然以相同的最後修改日期存在,當我們開始我們知道沒有人改變了它,所以我們可以使用的最後修改時間更新。
然而,當使用兩個會話手動執行此操作時,我注意到如果兩個客戶端大致同時選擇它可能會因爲錯過在同一秒內發生的選擇和更新步驟之間的行而發生更改,或者毫秒。
最終的結果是我打斷了其他用戶的更改,並且沒有發生警告。
我正在考慮使用SELECT FROM UPDATE,但顯然這是一個bad idea(特別是對web應用程序),文章建議重讀(這是我在上面做的),但我仍然認爲我有風險競賽狀況。
編輯:明確表示我關心時間被引用的方式。你可以採取
我認爲你鏈接的文章非常可疑。在DBA的生活中,比SELECT FOR UPDATE更多的悲哀巴恩。例如,執行不必要的讀取的gazillions和做額外的工作,而不是有一個適當的鎖定策略的過程。 – APC 2011-12-14 10:36:53
SELECT FOR UPDATE的實際問題是它是* stateful *而HTTP是* stateless *。使用專爲閱讀文檔而設計的技術來實現OLTP應用程序只是瘋狂的,並且是無盡悲傷的源泉,但顯然我們是一個受虐狂行業8-) – APC 2011-12-14 10:40:02