2013-07-06 29 views
8

Các Hibernate docs chương trình ví dụ này:Hibernate Read-Only giao dịch

session = sessionFactory.openSession(); 
session.beginTransaction(); 
List result = session.createQuery("from Event").list(); 
for (Event event : (List<Event>) result) { 
    System.out.println("Event (" + event.getDate() + ") : " + 
     event.getTitle()); 
} 
session.getTransaction().commit(); 
session.close(); 

Tại sao nó cần thiết để thực hiện các session.getTransaction().commit() mặc dù danh sách tổ chức sự kiện chỉ đơn thuần là in ra?

Trả lời

11

CHỌN cũng yêu cầu giao dịch. Không thể thực hiện SELECT mà không có bất kỳ giao dịch nào. Thực tế là bạn không phải bắt đầu và kết thúc giao dịch một cách rõ ràng khi chọn dữ liệu từ DB bằng cách sử dụng một số công cụ GUI của SQL là các công cụ này đang sử dụng chế độ autocommit. Trong chế độ tự động, cơ sở dữ liệu sẽ tự động bắt đầu và cam kết giao dịch cho từng câu lệnh SQL đơn lẻ sao cho bạn không phải khai báo rõ ràng ranh giới giao dịch.

Nếu bạn không kết thúc (tức là cam kết hoặc rollback) một giao dịch, kết nối cơ sở dữ liệu được sử dụng bởi giao dịch này sẽ không được phát hành và cơ sở dữ liệu của bạn sẽ hết các kết nối có sẵn cuối cùng.

Đối với chế độ ngủ đông, chế độ này sử dụng chế độ không tự động theo mặc định (được chỉ định bởi thuộc tính hibernate.connection.autocommit). Vì vậy, chúng tôi phải khai báo ranh giới giao dịch và đảm bảo giao dịch kết thúc.

Nhưng nếu bạn chỉ truy vấn dữ liệu sử dụng Hibernate API, nó không quan trọng thậm chí bạn không khai báo rõ ràng ranh giới giao dịch vì các nội dung sau:

  1. Cơ sở dữ liệu thường sẽ bắt đầu một giao dịch mới tự động khi SQL hiện tại tuyên bố yêu cầu một và không có giao dịch nào được bắt đầu rõ ràng trước đây.

  2. Session.close() sẽ close() nằm dưới Connection .Theo các đặc điểm kỹ thuật JDBC, nếu java.sql.Connection#close() được gọi và có một giao dịch tích cực, kết quả của giao dịch hoạt động này phụ thuộc vào việc thực hiện của nhà cung cấp JDBC. Thông thường, trình điều khiển JDBC sẽ tự động cam kết hoặc khôi phục giao dịch này. Nhưng trong trường hợp này, nó không quan trọng cho dù giao dịch cam kết hay quay lại vì bạn đã có được dữ liệu bạn muốn.

+0

Cảm ơn câu trả lời chi tiết –

Các vấn đề liên quan