Thỉnh thoảng ISession
sẽ thực thi các câu lệnh SQL cần thiết để đồng bộ hóa trạng thái kết nối ADO.NET với trạng thái của các đối tượng được giữ trong bộ nhớ. Quá trình này, tuôn ra, xảy ra theo mặc định tại các điểm sau
- từ một số lời mời của
Find()
hoặcEnumerable()
- từ
NHibernate.ITransaction.Commit()
- từ
ISession.Flush()
Các câu lệnh SQL được ban hành theo thứ tự sau
- tất cả các phần chèn vào thực thể, theo cùng thứ tự các đối tượng tương ứng đã được lưu bằng cách sử dụng
ISession.Save()
- tất cả các cập nhật thực thể
- tất cả các bộ sưu tập xóa
- tất cả các phần tử xóa bộ sưu tập, cập nhật và chèn
- tất cả các bộ sưu tập chèn
- tất cả các thực thể xóa, theo cùng một thứ tự các đối tượng tương ứng đã bị xóa bằng cách sử dụng
ISession.Delete()
(Một ngoại lệ là các đối tượng sử dụng tạo ID gốc được chèn khi chúng được lưu.)
Ngoại trừ khi bạn khám phá Flush()
, hoàn toàn không có gì đảm bảo về thời điểm Phiên thực hiện các cuộc gọi ADO.NET, chỉ có thứ tự thực hiện chúng . Tuy nhiên, NHibernate đảm bảo rằng các ISession.Find(..)
phương thức sẽ không bao giờ trả lại dữ liệu cũ; Họ cũng sẽ không trả lại dữ liệu sai.
Có thể thay đổi hành vi mặc định để việc xả nước xảy ra ít thường xuyên hơn. Các FlushMode
lớp học định nghĩa ba chế độ khác nhau: chỉ tuôn ra tại cam kết thời gian (và chỉ khi NHibernate ITransaction
API được sử dụng), tuôn ra tự động bằng cách sử dụng giải thích thói quen, hoặc không bao giờ tuôn ra trừ khi Flush()
được gọi một cách rõ ràng. Chế độ cuối cùng hữu ích cho các đơn vị công việc chạy dài, trong đó một ISession
được giữ mở và ngắt kết nối trong một thời gian dài.
...
Kết thúc một phiên bao gồm bốn giai đoạn riêng biệt:
- tuôn ra phiên
- cam kết giao dịch
- đóng phiên
- xử lý ngoại lệ
Rửa sạch phiên
Nếu bạn tình cờ sử dụng ITransaction
API, bạn không cần phải lo lắng về bước này. Nó sẽ được thực hiện ngầm khi giao dịch được cam kết. Nếu không, bạn nên gọi ISession.Flush()
để đảm bảo rằng tất cả các thay đổi được đồng bộ hóa với cơ sở dữ liệu.
Cam kết giao dịch cơ sở dữ liệu
Nếu bạn đang sử dụng API NHransnate ITransaction, thì giao diện này sẽ như sau:
tx.Commit(); // flush the session and commit the transaction
Nếu bạn đang tự mình quản lý các giao dịch ADO.NET, bạn nên Commit()
giao dịch ADO.NET theo cách thủ công .
sess.Flush();
currentTransaction.Commit();
Nếu bạn quyết định không cam kết thay đổi của mình:
tx.Rollback(); // rollback the transaction
hoặc là:
currentTransaction.Rollback();
Nếu bạn khôi phục giao dịch, bạn nên đóng ngay lập tức và hủy phiên hiện tại để đảm bảo rằng trạng thái nội bộ của NHibernate là nhất quán.
Đóng cửa ISession
Một cuộc gọi để ISession.Close()
đánh dấu sự kết thúc của một phiên. Hàm ý chính của Close () là kết nối ADO.NET sẽ bị hủy bỏ bởi phiên.
tx.Commit();
sess.Close();
sess.Flush();
currentTransaction.Commit();
sess.Close();
Nếu bạn đã cung cấp kết nối của riêng mình, hãy Close()
trả về một tham chiếu đến nó, để bạn có thể đóng nó theo cách thủ công hoặc đưa nó trở lại nhóm. Nếu không thì Close()
trả nó về hồ bơi.