我使用Oracle 11g(它可能對解決方案有影響)。我有如下版本的表格。我想從這個表中選擇由原子操作組成,插入到另一個表(取決於前者的狀態)並更新前一個表的狀態。樂觀鎖定的原子
我想簡單的解決方案(簡單的問題簡單的解決方案?),原子,我想避免死鎖。我選擇樂觀鎖定策略。
所以,我有這樣的表
CREATE TABLE table (
id int,
version int,
state varchar(20)
);
僞代碼我有這樣的事情:
Line 1: SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
Line 2: START TRANSACTION;
Line 3: SELECT state as S, version as V from table where id = X;
Line 4: if (S == 'TODO') then
Line 5: INSERT INTO other_table ...
Line 6: UPDATE table SET state = 'DONE', version = version + 1 WHERE id = X and version = V
Line 7: COMMIT;
據我瞭解SQL事務,另一個線程可以執行第6行之間的相同的代碼塊和第一胎的第七胎。然後(考慮隔離級別=讀取提交)我有兩個插入到我不想要的other_table
。
我怎樣才能使這個代碼塊真的原子?
我想避免鎖定行和序列化隔離級別(死鎖)。
如果你的DBMS使用樂觀併發控制,你永遠不會得到任何死鎖。事務是一個原子操作。 – jarlh
您是否有特定的RDBMS? –
是的,它是Oracle 11g。 – emstol