0

我有一個表格說CREDIT_POINTS。它已經低於專欄。在多線程環境中更新表格

Copmany Credit points Amount 

A   100    50 
B   200    94 
C   250    80 

有多個線程將更新此表。有一種方法,其讀取貸方積分並做一些計算和更新數額以及貸方積分。這個計算需要相當長的一段時間。

假設線程A讀取並正在進行一些計算。在A回寫之前,線程B正在從表中讀取數據以進行計算和更新數據。在這裏,我丟失了線程A更新的數據。在許多情況下,由於多個線程正在讀取和更新表,因此信用點數和金額不會同步。

我們在這裏可以做的一件事是使用同步方法。 我正在考慮使用spring事務。春季交易線程安全嗎?還有什麼是這個好的選擇? 任何幫助非常感謝。

注意:我正在使用ibatis(ORM)和MySQL。

回答

1

您絕對需要交易以確保您根據您之前閱讀的數據進行更新。此事務必須包含讀取和寫入操作。 爲了確保多線程合作,你不需要做同步,但有兩種選擇:

  • 悲觀鎖定:使用select進行更新。這將設置一個鎖,該鎖將在交易結束時釋放。
  • 樂觀鎖定:在更新期間,您會發現數據已被更改,如果是這樣,您必須重複閱讀和更改。您可以在更新聲明中實現此目的,不僅要搜索公司(我希望的主鍵),還要查找先前讀取的金額和「信用點」。

這兩種方法都有其優點。我建議在完成此應用程序之前讓自己熟悉這些概念。一旦有沉重的負擔,如果你做錯了什麼,你的金額和信用點可能會錯誤地計算出來。

+0

使用spring事務解決了我的問題。謝謝aschoerk – user2823355