batch_size 即同時提交數據的數量,原本與事務并沒有什么關系,但如果涉及到同一張表數據的同一種操作,可能就會發生微妙的關系了。
場景如下:
場景一:使用 spring 控制事務,將方法事務配置為 not_supported,向同一張表中插入兩條數據,保證第一條數據正常插入,而第二條數據受約束(如唯一約束)插入失敗。
預測結果:第一條數據成功,第二條失敗。
實際結果:兩條數據均失敗。
原因:hibernate 將兩條插入放到了同一個 batch 中,提交同時失敗了。
場景二:同樣使用 spring 控制事務,將方法事務配置為 not_supported,向第一張表中插入一條合法數據,成功,向第二張表插入數據,受約束(如唯一約束)插入失敗。
預測結果:第一條數據成功,第二條失敗。
實際結果:第一條數據成功,第二條失敗。
原因:hibernate 分別插入數據并提交,在無事務的情況下,第一條成功,第二條失敗。
那么如何讓場景一得到預測結果呢,一個簡單的解決方法,將 hibernate.jdbc.batch_size 設置為 1,即可。
所以,即使控制了事務,也未必能夠得到期望的結果,還需要考慮某些特殊的場景帶來的影響。
posted on 2008-03-06 14:18
哈哈的日子 閱讀(1830)
評論(2) 編輯 收藏 所屬分類:
Java