關於oracle的upsert

codecraft發表於2017-01-16

incr

redis有incr功能,可以很輕鬆地原子遞增,同時對不存在的key,預設初始為0,incr之後為1.這個即為方便,既解決了upsert的問題,也解決了原子併發問題。

pg有upsert的功能,oracle沒有,有人有給出如下方案

merge into mergetest m using dual on (a = xa)
         when not matched then insert (a,b) values (xa,1)
             when matched then update set b = b+1;

不過,這個並不是原子的,併發情況下還是存在insert多條的情況。

alternative

有沒有其他方案呢,傳統的方案就是用樂觀鎖,或者悲觀鎖,不過這個效能太差。另外一個方案,就是把incr的操作日誌化,即不實際操作incr,而是記錄這個操作,之後count一下就出來所有的累計值了。

doc

相關文章