ความแตกต่างระหว่าง Save และ saveAndFlush ใน Spring data jpa


131

ฉันพยายามเรียนรู้ข้อมูลสปริง JPA โดยทดสอบการทำงานของ CRUD ผ่านทางJpaRepository.

ฉันเจอสองวิธีsaveและsaveAndFlush. ฉันไม่เข้าใจความแตกต่างระหว่างสองสิ่งนี้ ในการโทรsaveการเปลี่ยนแปลงของฉันกำลังได้รับการบันทึกลงในฐานข้อมูลดังนั้นการใช้saveAndFlushไฟล์.

คำตอบ:


139

เปิดsaveAndFlushการเปลี่ยนแปลงจะถูกล้างไปยัง DB ทันทีในคำสั่งนี้ ด้วยsaveสิ่งนี้ไม่จำเป็นต้องเป็นจริงและอาจอยู่ในหน่วยความจำจนกว่าflushหรือcommitออกคำสั่ง

แต่โปรดทราบว่าแม้ว่าคุณจะล้างการเปลี่ยนแปลงในธุรกรรมและไม่ได้กระทำการเปลี่ยนแปลงดังกล่าวการเปลี่ยนแปลงจะยังไม่ปรากฏแก่ธุรกรรมภายนอกจนกว่าจะมีการกระทำในธุรกรรมนี้

ในกรณีของคุณคุณอาจใช้กลไกการทำธุรกรรมบางประเภทซึ่งจะออกcommitคำสั่งให้คุณหากทุกอย่างทำงานได้ดี


35
"จะไม่ปรากฏให้ธุรกรรมภายนอกเห็นจนกว่าการคอมมิตในธุรกรรมนี้" ขึ้นอยู่กับระดับการแยกของธุรกรรมอื่น ๆ หากระดับการแยกธุรกรรมคือ READ_UNCOMMITTED, ระดับการแยกธุรกรรมจะเห็นสิ่งที่ถูกล้างออก แต่ยังไม่ได้กระทำโดยธุรกรรมอื่น
Gab 是好人

1
แต่ในโปรเจ็กต์ของฉันฉันใช้ save (), saveAll () และมันยังคงอยู่ใน DB โดยไม่ต้องคอมมิตหรือล้างการโทรอย่างชัดเจน แล้วทำไมฉันถึงชอบ saveAndFlush? โหมดฟลัชทุกสิ่งอยู่ในโหมดเริ่มต้น
P Satish Patro

37

ขึ้นอยู่กับโหมดไฮเบอร์เนตฟลัชที่คุณใช้อยู่ ( AUTOเป็นค่าเริ่มต้น) saveอาจหรือไม่เขียนการเปลี่ยนแปลงของคุณลงในฐานข้อมูลทันที เมื่อคุณเรียกsaveAndFlushคุณกำลังบังคับใช้การซิงโครไนซ์สถานะแบบจำลองของคุณกับ DB

หากคุณใช้โหมดล้างอัตโนมัติและคุณกำลังใช้แอปพลิเคชันของคุณเพื่อบันทึกก่อนจากนั้นจึงเลือกข้อมูลอีกครั้งคุณจะไม่เห็นความแตกต่างของ bahvior ระหว่างsave()และsaveAndFlush()เนื่องจากการเลือกทริกเกอร์ให้เกิดการฟลัชก่อน ดูdocumention


ขออภัยถ้าฉันsaveเป็นเอนทิตีและเป็นเอนทิตีเดียวกันอีกครั้งคุณหมายถึงด้วยsaveคำสั่งที่สองจะไม่ทำให้เกิดข้อยกเว้นสำหรับการทำซ้ำเช่น ??
azerafati

3
@Bludream ใช่มันเป็นความเข้าใจของฉันที่โทรไปsaveเป็น idempotent ดูนี้ด้ายสำหรับรายละเอียดเพิ่มเติม
Ralf
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.