insert into t1(f1,f2) values(v1,v2);
update t2 set f3=f3+1 where pk=id;
往 t1 表插入一條明細記錄時,同時將 t2 表中的計數欄位 f3 加 1,2個dml陳述句在同一個事務中執行。
在本機的測驗環境一切都正常
發布到生產環境中,訪問比較集中的時候,會出現 t1 表中的記錄數比 t2 表中的計數值大
請高手幫忙分析一下,這是什么原因操作的,謝謝!
uj5u.com熱心網友回復:
會出現 t1 表中的記錄數比 t2 表中的計數值大這個應該是有的程式段沒有更新 t2 ;
不妨在兩張表上都建一個觸發器,用來記錄一下,看看什么樣的資料,只寫了 t1 而沒有更新 t2;
uj5u.com熱心網友回復:
1 insert into t1(f1,f2) values(v1,v2);2 update t2 set f3=f3+1 where pk=id;
第2條update中"pk=id"條件不滿足這種情況有沒有算進去??
uj5u.com熱心網友回復:

整個系統中,只有這一個地方有這樣的操作邏輯。
t1 和 t2 有主外鍵關系的,所以 "pk=id"條件肯定都是成立的。
uj5u.com熱心網友回復:
興許訪問比較集中的時候出現時間差,既然update操作依賴于insert操作,為何不直接做成觸發器呢?uj5u.com熱心網友回復:
建議改用觸發器uj5u.com熱心網友回復:
可能是事務1還沒有結束,同一個ID又有INSERT T1和UPDATE T2發生,此時事務2會等待事務1結束。事務1提交后,事務2會執行INSERT和UPDATE,并提交。
整個邏輯上貌似沒有問題,但是INSERT執行了2次,UPDATE后面的 F3+1的F3可能值相同,如這樣,就會導致T2比T1少的情況。
改用觸發器吧
uj5u.com熱心網友回復:
在t1表中增加一個類似PK的欄位,再與t2同步比較看結果uj5u.com熱心網友回復:
使用事務機制提交吧,大多數語言都支持資料的事務機制的,你使用的是什么編程語言呼叫的可以考慮使用select for update nowait的方式先將記錄鎖住,然后執行操作,最后commit釋放鎖
uj5u.com熱心網友回復:
id從它在plsql中的顏色來看,貌似是個關鍵字,估計你的這個問題可能和它有關轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/117701.html
標籤:開發
上一篇:sql loader 匯入資料,加上最后一列就無法正常匯入
下一篇:用SQL設定頁數的問題。求解
