2014-10-08 108 views
1

休眠需要我想知道是'session.getTransaction()提交();'而獲取數據

需要休眠session.getTransaction().commit();而獲取數據

private List listEvents() { 
     Session session = HibernateUtil.getSessionFactory().getCurrentSession(); 
     session.beginTransaction(); 
     List result = session.createQuery("from Event").list(); 
     session.getTransaction().commit(); 
     return result; 
    } 

這個例子是取從http://docs.jboss.org/hibernate/orm/4.1/manual/en-US/html_single/#tutorial-firstapp-firstclass

回答

1

是的,即使對於讀操作,您也需要一個事務,它應該按照hibernate文檔提交。

下面是詳細信息:

13.2. Database transaction demarcation

數據庫或系統,事務邊界總是必要的。沒有 與數據庫的通信可能發生在數據庫 事務之外(這似乎混淆了很多習慣了 自動提交模式的開發人員)。 始終使用清除事務邊界,即使對於 只讀操作。根據您的隔離級別和數據庫 的功能,這可能不是必需的,但是如果您始終明確地劃分事務,則不存在缺點。當然,即使是讀取數據,一個單一的數據庫事務處理也會比許多小型事務處理更好。

在普通JDBC的情況下,默認情況下啓用自動提交。下面是詳細信息吧:

Disabling Auto-Commit Mode

當創建一個連接,它是在自動提交模式。這意味着 每個單獨的SQL語句都被視爲一個事務,並且在執行後立即自動提交。(更準確地說,默認情況下,SQL語句在完成時爲 ,而不是當它被執行時提交。當所有的 的結果集和更新計數已被檢索完成後,語句完成。 所有情況下,但是,聲明中完成的,因此承諾, 執行完成後右)

1

AFAIK:在大多數情況下,這並不重要。兩種方法(提交/回滾)都是有效的。

但推薦的方法是提交,因爲關係數據庫針對最常見的預期情況進行了性能優化,這是提交而不是回滾。


UPDATE:
你可以看看下面的similar post,如果你想知道爲什麼在所有的交易開始。

+0

但爲什麼需要它取 – xrcwrn 2014-10-08 07:00:56

+0

有異。好的做法是爲每個數據庫操作打開事務。此外,事務對確保沒有其他事務添加使視圖不一致的數據很有用。 – 2014-10-08 07:12:19