2015-12-07 63 views
1

我使用spring jdbctemplate來更新某些行,bute我得到了這個日誌消息。兩個完全相同的sql返回不同的受影響的行。第二個更新操作沒有辦法返回0受影響的行。無法弄清楚。java preparedstatement executeUpdate返回錯誤受影響的行

2015-12-03 12:37:37 [INFO] [qtp683362635-1187] c.t.s.c.i.d.IDGJdbcDao - update: 

update JCSZ..T_IDG 
    set N_VALUE = ? 
where C_BusinessID = ? 
    and C_ComID = ? 
    and C_RateID = ? 
    and N_TYPE = ? 
    and N_ConfType = ? 

受影響的行:373行

 2015-12-03 12:37:38 [INFO] [qtp683362635-746] c.t.s.c.i.d.IDGJdbcDao - update: 
update JCSZ..T_IDG 
    set N_VALUE = ? 
where C_BusinessID = ? 
    and C_ComID = ? 
    and C_RateID = ? 
    and N_TYPE = ? 
    and N_ConfType = ? 

受影響的行:0行

+0

您正在使用那些具有完全相同參數的語句,對嗎?你會直接接替對方,也許會有一些觸發器,當'N_VALUE'發生變化時,它會從where子句中改變你的一列嗎?只是一個隨機猜測... – Aracurunir

+1

另一個猜測,你設置了兩次完全相同的值?也許這會返回0,因爲第二次沒有改變。 – Aracurunir

+0

您是否嘗試更改說明的順序? – reos

回答

1

做一些啓發式算法(問谷歌),我發現UPDATE WITH RETURNING一些提示只給你數實際改變的行數。在執法機關這應該是行爲:

我認爲它適用於其它數據庫系統也是如此。

因此,當執行兩次完全相同的更新查詢時,您的結果正是應該發生的情況。第一次改變了一切,返回找到的行數,第二次沒有改變,給你0

+0

更新列不在where列,所以如果不考慮其他因素,每次我執行sql,如果where條件相同,它應該返回相同的結果,即使結果不一致,它應該不是0 – dingjsh

+0

我想說的是:'table':{id:1,value:0}。 'code':'update table set value = 2 where id = 1;更新表設置值= 2,其中id = 1'。第一次更新將返回1,因爲1行已從「0」更改爲「2」。第二個更新看到'table_updated':{id:1,value 2},所以它返回0,因爲將值從'2'更改爲'2'不會影響任何行。如果這不是你的情況,我錯過了你的問題。 – Aracurunir

+0

如果有一些線程安全問題是完全可能的,那麼就會像你說的那樣發生。你是一個真正的救命 – dingjsh

相關問題