簡體   English   中英

如何在休眠狀態下處理多個會話事務提交和回滾?

[英]How to handle multiple session tranaction commit and rollback in hibernate?

我的代碼中有一個問題,我正在使用服務器和客戶端會話obj。 像這樣

Session serverSession=HibernateUtilServer.getSession();
Session clientSession=HibernateUtilLocal.getSession();

//這里的一些數據庫操作...

serverSession.beginTransaction().commit();
clientSession.beginTransaction().commit();

但是問題是serverSession.beginTransaction().commit(); 在此行之后,如果我遇到一些網絡問題,則表示某些異常 我不能提交我的clientSession數據,這意味着我可以clientSession.beginTransaction().rollBack(); 因此,我想回滾serverSession數據,以及如何做到這一點,請幫幫我。

注意:在這里,serverSession和clientSession都具有不同的數據庫連接和不同的配置文件,謝謝。

如果您運行本地事務,則每個請求會話模式每個會話使用一個JDBC連接。 對於JTA,每個語句之后都會主動釋放連接,僅在下一個語句重新獲得連接。

Hibernate事務API將開始/提交/回滾委派給本地事務的JDBC連接和JTA的關聯UserTransaction。 因此,您可以在同一個Hibernate Session上運行多個事務,但是有一個陷阱。 引發異常后,您將無法再使用該Session。

我的建議是分而治之。 只需拆分所有項目,為每個項目構造一個Command對象,然后將它們發送到ExecutorService#invokeAll。 使用返回的List進行迭代,並調用Future#get()以確保原始線程在所有批處理作業完成后等待。

ExecutorService將確保您同時運行所有Command,並且每個Command應該使用使用其自身@Transaction的Service。 因為事務是線程綁定的,所以您將使所有批處理作業獨立運行。

這取決於冬眠和春天的使用。 我看到您使用了非常好的框架。 它已經有很好的事務管理支持。 我建議您不要手動執行此操作。 使用其核心交易支持。 只是示例:@Transaction Annotation在方法級別,類級別等處標記,只需閱讀其工作原理即可!! 你會得到更好的主意。

參考鏈接: https : //docs.spring.io/spring/docs/4.2.x/spring-framework-reference/html/transaction.html

編輯如果不使用spring,則需要捕獲異常。 您需要在那里回滾事務。 如果要添加框架層,則將超級類或通用方法添加到回滾事務。 調用捕獲塊。

暫無
暫無

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

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