batch_size 即同時(shí)提交數(shù)據(jù)的數(shù)量,原本與事務(wù)并沒(méi)有什么關(guān)系,但如果涉及到同一張表數(shù)據(jù)的同一種操作,可能就會(huì)發(fā)生微妙的關(guān)系了。
場(chǎng)景如下:
場(chǎng)景一:使用 spring 控制事務(wù),將方法事務(wù)配置為 not_supported,向同一張表中插入兩條數(shù)據(jù),保證第一條數(shù)據(jù)正常插入,而第二條數(shù)據(jù)受約束(如唯一約束)插入失敗。
預(yù)測(cè)結(jié)果:第一條數(shù)據(jù)成功,第二條失敗。
實(shí)際結(jié)果:兩條數(shù)據(jù)均失敗。
原因:hibernate 將兩條插入放到了同一個(gè) batch 中,提交同時(shí)失敗了。
場(chǎng)景二:同樣使用 spring 控制事務(wù),將方法事務(wù)配置為 not_supported,向第一張表中插入一條合法數(shù)據(jù),成功,向第二張表插入數(shù)據(jù),受約束(如唯一約束)插入失敗。
預(yù)測(cè)結(jié)果:第一條數(shù)據(jù)成功,第二條失敗。
實(shí)際結(jié)果:第一條數(shù)據(jù)成功,第二條失敗。
原因:hibernate 分別插入數(shù)據(jù)并提交,在無(wú)事務(wù)的情況下,第一條成功,第二條失敗。
那么如何讓場(chǎng)景一得到預(yù)測(cè)結(jié)果呢,一個(gè)簡(jiǎn)單的解決方法,將 hibernate.jdbc.batch_size 設(shè)置為 1,即可。
所以,即使控制了事務(wù),也未必能夠得到期望的結(jié)果,還需要考慮某些特殊的場(chǎng)景帶來(lái)的影響。