JPA中save和saveAndFlush的區別,首先直接看圖:

save是CrudRepository下的。
saveAndFlush是JpaRepository下的。
一般情況下save就足夠了,但是如果在同一個transaction里,比如你在方法上標了@Transactional,這時你想先保存Order,然后直接在這個Transaction里保存OrderItem,但是OrderItem需要新建的Order的ID,這時候保存Order就可以用saveAndFlush,你的Entity就會有保存在數據里的id了。
講到這兒,一些小伙伴就已經明白了,但是還有些萌新可能會被Transaction給蒙住。
Transaction是數據庫提供的服務,跟spring啥的沒啥關系,spring只是按照數據庫廠商提供的規范封裝擴展了一下。
所以想要理解save和saveAndFlush原理的,可以先去數據里試下Transaction,原來就是set auto_commit = 0; commit,rollback。
所有這里的flush就是commit的意思。
Spring Data JPA高並發下,使用save()發現無論怎么同步鎖都會出現數據誤差,后來換成saveAndFlush()方法結果對了,以此推斷save()方法具有延遲性。
