2013-11-23 82 views
1

我知道事務有助於回滾更新操作,如果出現任何問題(例如代碼異常或數據庫關閉)。我不明白的是以下幾點:瞭解休眠事務

this page

13.2。數據庫事務劃分

數據庫或系統事務邊界總是必需的。沒有 與數據庫的通信可能發生在數據庫 事務之外(這似乎混淆了很多習慣了 自動提交模式的開發人員)。始終使用清晰的事務,甚至對 只讀操作

這一個說,一個事務應該在所有情況下使用,即使是只讀操作

  • 爲什麼這是必須的?只有當我要更新數據庫時,我不應該這樣做嗎?
  • 如果這是必須的,爲什麼不在獲得會話時自動啓動?

關於以下引用段落(在)。

事務Transaction(org.hibernate.Transaction)

(可選)單線程的,短暫的使用的應用程序指定的工作 原子單元對象。它從底層的JDBC,JTA或CORBA事務中抽象出應用程序。 org.hibernate.Session可能跨越幾個 org.hibernate.Transactions在某些情況下。但是,交易 劃分,無論是使用底層API還是 org.hibernate.Transaction,都不會是可選的。

什麼意思是第一個字(Optional)表示?

這個聲明是什麼意思?

However, transaction demarcation, either using the underlying API or org.hibernate.Transaction, is never optional.?!

另外我從this page瞭解到,那每當我打開一個Hibernate session時是否更新或加載一個對象,我都要開始一個事務

回答

1

您不需要爲加載操作啓動事務。如果您的操作可能會執行更新,並且您希望提交/回滾語義,以防其他情況在該範圍內失敗,則只需要它。因此,hibernate事務只是一個範圍,並且將在需要時使用數據庫的基礎事務,例如第一次獲取連接時。如果它處於事務中,那麼該連接將用於事務作用域的生命週期,而不是針對每個SQL操作返回到池中,這就是沒有休眠事務時發生的情況。

+0

感謝您的回答。但實際上文檔強調使用事務,即使是隻讀操作也是如此。我更多地澄清了我的問題。 –

+0

其誤導性的文件在一定程度上。它只需要在多個操作必須是原子的時候聲明顯式事務,並且全部或全部改變語義。但是,在某些情況下,您可以引發讀鎖,並且您可能希望它們持續多次讀取。我同意你的看法,這個文件有點誤導。 –

+0

根據這篇文章,只有啓用auto_commit https://community.jboss.org/wiki/Non-transactionalDataAccessAndTheAuto-commitMode時,才需要只讀操作事務 – peceps