簡體   English   中英

Hibernate只讀事務

[英]Hibernate Read-Only Transaction

Hibernate 文檔顯示了這個例子:

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();

為什么有必要執行session.getTransaction().commit()即使事件列表只是打印出來?

SELECT還需要事務。 沒有任何事務就不可能執行SELECT。 使用某些SQL GUI工具從DB中選擇數據時,您不必顯式啟動和結束事務,這些工具正在使用自動提交模式。 在自動提交模式下,數據庫將自動啟動並為每個單個SQL語句提交事務,這樣您就不必顯式聲明事務邊界。

如果您沒有結束(即提交或回滾)事務,則不會釋放此事務使用的數據庫連接,並且最終將使您的數據庫用盡可用的連接。

對於hibernate,它默認使用非自動提交模式(由屬性hibernate.connection.autocommit指定)。 所以我們必須聲明事務邊界並確保事務結束。

但是,如果您只使用hibernate API查詢數據,那么即使您沒有顯式聲明事務邊界也是可以的,原因如下:

  1. 當前SQL語句需要一個並且之前沒有顯式啟動任何事務時,數據庫通常會自動啟動一個新事務。

  2. Session.close()關閉()底層連接 。根據JDBC規范,如果調用java.sql.Connection #close()並且存在活動事務,則此活動事務的結果取決於JDBC供應商'實施。 通常,JDBC驅動程序將自動提交或回滾此事務。 但在這種情況下,事務提交或回滾無關緊要,因為您已經獲得了所需的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM