有表t_dept_total(dept_no varchar2(20),op_date date,total number, constrant pk_dept_total primary key(dept_no,op_date));
使用merge into系進行資料寫入:
merge into t_dept_total a using (select :deptno dept_no, to_date(:opdate,'yyyy-MM-dd')op_date,1 inc from dual) b on (a.dept_no=b.dept_no and a.op_date=b.op_date)
when matched then update set total=total+b.inc
when not matched then insert(dept_no,op_date,total) values(b.dept_no,b.op_date,b.inc)
:deptno和:opdate為動態傳入引數。
現在使用多執行緒傳入并執行上面的陳述句,如果傳入的引數:deptno和:opdate相同的話,就會出現主鍵沖突錯誤。這種情況如果錯誤后再執行一遍就會成功。
Oracle是怎樣處理的?為什么不是其中一個進行insert其他的執行update?大資料量多執行緒時應該怎樣使用才能避免出現主鍵重復?
uj5u.com熱心網友回復:
用悲觀鎖,select ... for update后再執行merge,但前提是多執行緒merge的時候,相同主鍵的資料無論哪一份在業務上來說都是正確的。uj5u.com熱心網友回復:
select...for update的前提是資料已經存在了,現在是表是空的,沒有資料,同時merge1000筆相同的資料,oracle也許在這一刻認為這1000筆資料都要執行insert操作(主鍵改成自增的,會出現1000條除了主鍵不同,其他欄位都相同的記錄),所以select...for update根本解決不了。
uj5u.com熱心網友回復:
那那就讓它報錯唄,你既然程式這么處理,說明業務上,無論insert哪個執行緒的資料,都可以認為是正確的,因為根本沒有先來后到的邏輯需要處理,報錯就報錯了,至少某個主鍵已經進去了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/48180.html
標籤:開發
上一篇:sqlplus亂碼
下一篇:sqlldr兩個相關問題
