0
我有我需要的情況:如何鎖定一行,並在多個交易中使用鎖定?
- 讀取一行的值。
- 如果某列的值爲'X',則執行操作A.否則,執行操作B.
- 如果我們執行操作A,則使用操作的結果更新列。
操作A不是數據庫操作,可能需要一段時間才能運行,並且它不可逆。操作B不是數據庫操作,但運行速度非常快。該序列在多個服務器上的多個線程上執行。
目前我們沒有鎖定,所以偶爾我們會看到動作A被多次執行,當它只發生一次時。我認爲我的唯一解決方案是以某種方式將上面的序列打包成獲取鎖步驟和版本鎖步驟,我不知道該怎麼做。
我看過a similar question,答案是在行上添加'locked'和'acquiry time'列。但是,在這種情況下,業主不擔心頻繁重新獲得鎖定。如果每次我想執行序列時都必須旋轉等待前一個鎖過期,我的服務器的性能可能會超出窗口。
是否有內置的SQL,我可以在這裏使用?
哦哇,經典的X Y問題。我甚至沒有想到這一點。 –
這是否仍然有可能兩個線程同時查詢該行,並且這兩個線程都將該行視爲「X」,並且都嘗試將其更新爲掛起? –
@AndrewWilliamson:如果你選擇了中間層,然後進行更新。但是如果你只是做了更新,那應該是原子的(除非你玩SET ISOLATION_LEVEL遊戲)。 – tpdi