Khi bạn gọi session.save(a)
Hibernate về cơ bản nhớ một nơi nào đó trong phiên mà đối tượng này phải được lưu. Nó có thể quyết định nếu anh ta muốn phát hành INSERT INTO...
ngay lập tức, một thời gian sau đó hoặc trên cam kết. Đây là một cải tiến hiệu suất, cho phép Hibernate chèn hàng loạt hoặc tránh chúng nếu giao dịch được khôi phục.
Khi bạn gọi session.flush()
, Hibernate buộc phải phát hành INSERT INTO...
đối với cơ sở dữ liệu. Thực thể được lưu trữ trong cơ sở dữ liệu, nhưng chưa được cam kết. Tùy thuộc vào mức cô lập giao dịch, nó sẽ không được nhìn thấy bởi các giao dịch đang chạy khác. Nhưng bây giờ cơ sở dữ liệu biết về hồ sơ.
Khi bạn gọi transaction.rollback()
, Hibernate sẽ cuộn lại giao dịch cơ sở dữ liệu. Cơ sở dữ liệu xử lý rollback, do đó loại bỏ đối tượng mới được tạo ra.
Bây giờ, hãy xem xét trường hợp không có flush()
. Trước hết, bạn không bao giờ chạm vào cơ sở dữ liệu để hiệu suất là tốt hơn và rollback về cơ bản là một no-op. Mặt khác, nếu mức cô lập giao dịch là READ UNCOMMITTED
, các giao dịch khác có thể xem bản ghi được chèn ngay cả trước khi cam kết/khôi phục. Nếu không có flush()
điều này sẽ không xảy ra, trừ khi Hibernate không quyết định flush()
ngầm.
Nguồn
2012-03-28 13:10:09
tôi không thể nghĩ về giao dịch ngủ đông giống như giao dịch DB thực sự bằng cách nào đó. cảm ơn bạn ! bạn có thể kiểm tra câu hỏi này không? cho phép tôi hỏi câu hỏi này mà bạn đã trả lời. http://stackoverflow.com/questions/9903872/hibernate-session-save-creating-not-neccessary-insert-statements – kommradHomer
Phần này của câu trả lời là không chính xác: "hibernate đủ thông minh không gửi chèn/cập nhật cho DB cho đến khi nó biết nếu giao dịch sẽ được cam kết hoặc quay trở lại ".Hibernate S send gửi chèn/cập nhật cho DB bất cứ lúc nào phiên được xóa bỏ, và điều này có thể được trước khi nó biết nếu giao dịch được cam kết hoặc quay trở lại. – SteveT
@SteveT bạn có biết bất kỳ kịch bản nào trong đó phiên sẽ bị xóa mà không cần gọi .flush() hoặc cam kết giao dịch không? – ilcavero