[英]how can we handle concurrent transactions in hibernate
我們實現了一個multi threaded
應用程序,用於更新數據庫中表的列
即用戶帳戶余額 。 休眠用於將我們的應用程序與數據庫進行交互。 該應用程序部署在多台服務器中 ,並將作為集群工作 。
假設發送了多個請求以更新數據庫中的同一用戶帳戶。 我們如何處理這種情況? 來自多個服務器或來自同一服務器的不同線程的請求將嘗試同時更新此請求。 如何確保操作的原子性。 我們可以使用Hibernate或Spring框架通過數據庫表鎖定或行級鎖定來做同樣的事情嗎
范例 :
thread A
從server S1
和thread B
從server S2
訪問相同的record R
在同一時間 。
首先,來自server S1
的thread A
將R
的值更新為R1
並commit
transaction
。
同時,來自server S2
的thread B
將R
的值更新為R2
並commit
transaction
。
這種情況的結果是什么? 我們必須鎖定一項交易才能獲得正確的結果?。 我們如何鎖定交易,因為它來自不同的服務器?
您可以使用Hibernate樂觀鎖定。
樂觀鎖定假設多個事務可以完成而不會互相影響,因此事務可以繼續進行而不會鎖定它們影響的數據資源。 在提交之前,每個事務都將驗證沒有其他事務已修改其數據。 如果檢查顯示有沖突的修改,則提交的事務將回滾[1]。
此處提供更多信息: https : //docs.jboss.org/hibernate/orm/4.0/devguide/zh-CN/html/ch05.html
對於您提到的方案,您需要考慮以下幾點:
設置事務隔離級別。 請參考此鏈接以設置事務隔離級別。 在大多數情況下, READ COMMITTED
足以滿足要求,但您也可以探索其他選項。
如果您有像JMS這樣的多個事務資源,請考慮使用XA事務。 即在您的配置中,您可以使用XA投訴數據庫驅動程序。 請參閱此鏈接以獲取更多詳細信息 。 XA驅動程序提供了兩階段提交協議,該協議可保持事務的原子性。
如果您有EJB,那么container managed transaction
可以為您完成所有與事務相關的工作。 請參閱此鏈接以獲取更多信息 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.