Sự khác biệt giữa lưu và lưuAndFlush trong dữ liệu Spring jpa


131

Tôi đang cố gắng tìm hiểu dữ liệu mùa xuân JPA bằng cách thử nghiệm một số thao tác CRUD thông qua JpaRepository.

Tôi đã đi qua hai phương pháp savesaveAndFlush. Tôi không nhận được sự khác biệt giữa hai. Khi gọi, savenhững thay đổi của tôi cũng được lưu vào cơ sở dữ liệu, vậy việc sử dụng là gì saveAndFlush.

Câu trả lời:


139

Bật saveAndFlush, các thay đổi sẽ được chuyển sang DB ngay lập tức trong lệnh này. Với save, điều này không nhất thiết là đúng và có thể chỉ còn trong bộ nhớ, cho đến khi flushhoặc commitcác lệnh được ban hành.

Nhưng hãy lưu ý rằng ngay cả khi bạn xóa các thay đổi trong giao dịch và không cam kết chúng, các thay đổi vẫn sẽ không hiển thị đối với các giao dịch bên ngoài cho đến khi cam kết trong giao dịch này.

Trong trường hợp của bạn, bạn có thể sử dụng một số loại cơ chế giao dịch, sẽ ra commitlệnh cho bạn nếu mọi thứ hoạt động tốt.


35
"Sẽ không hiển thị với các giao dịch bên ngoài cho đến khi cam kết trong giao dịch này" Nó phụ thuộc vào mức độ cô lập của các giao dịch khác. Nếu mức cô lập của giao dịch là READ_UNCOMMITTED , thì nó sẽ thấy những gì đã bị xóa nhưng chưa được cam kết bởi các giao dịch khác.
Gab 是

1
nhưng, trong dự án của tôi, tôi sử dụng save (), save ALL () và nó vẫn tồn tại trong DB mà không cần xác nhận hoặc xóa cuộc gọi một cách rõ ràng. Vậy thì tại sao tôi lại thích saveAndFlush? Chế độ FLush tất cả những thứ đó đều ở chế độ mặc định
P Satish Patro

37

Tùy thuộc vào chế độ tuôn ra ngủ đông mà bạn đang sử dụng ( AUTOlà mặc định) savecó thể hoặc không thể ghi các thay đổi của bạn vào DB ngay lập tức. Khi bạn gọi, saveAndFlushbạn đang thực thi đồng bộ hóa trạng thái mô hình của mình với DB.

Nếu bạn sử dụng chế độ tuôn ra TỰ ĐỘNG và bạn đang sử dụng ứng dụng của mình để lưu trước tiên và sau đó chọn lại dữ liệu, bạn sẽ không thấy sự khác biệt về bahvior giữa save()saveAndFlush()bởi vì lựa chọn kích hoạt tuôn ra trước. Xem tài liệu .


xin lỗi nhưng nếu tôi savelà một thực thể và một lần nữa cùng một thực thể, ý bạn là với savelệnh thứ hai sẽ không ném ngoại lệ cho việc sao chép chẳng hạn ??
azerafati

3
@Bludream Vâng, theo hiểu biết của tôi thì các cuộc gọi savelà không có gì. Xem chủ đề này để biết thêm chi tiết.
Ralf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.