0

私はテーブルにCREDIT_POINTSと言っています。それは列の下にあります。マルチスレッド環境でテーブルを更新する

Copmany Credit points Amount 

A   100    50 
B   200    94 
C   250    80 

この表を更新する複数のスレッドがあります。 クレジットポイントを読み、との数値とのクレジットポイントを計算して更新する方法があります。この計算にはかなりの時間がかかります。

スレッドAが読んで、何らかの計算を行っているとします。同時にAがスレッドBに書き戻す前に、テーブルからデータを読み込んで計算を行い、データを更新しています。ここでは、スレッドAが更新されたデータを失っています。多くの場合、複数のスレッドがテーブルを読み込んで更新しているため、クレジットポイントと金額は同期しません。

ここでできることの1つは同期メソッドを使用することです。 私は春のトランザクションを使用することを考えています。春のトランザクションスレッドは安全ですか?これには他に何が良い選択肢ですか? ご迷惑をおかけして申し訳ございません。

注:ibatis(ORM)およびMySQLを使用しています。

答えて

1

これまでに読んだデータに基づいて更新を行うことを確認するには、間違いなくトランザクションが必要です。このトランザクションには、読み取りおよび書き込み操作が含まれている必要があります。悲観的ロック

  • :あなたは、SELECT FOR UPDATEを使用する複数のスレッドを使用すると、同期が、2つのオプションがあります必要はありません協力していることを確認する 。これにより、トランザクションの終了時に解放されるロックが設定されます。
  • 楽観的なロック:更新中にデータが変更されていることが判明した場合は、読み込みと変更を繰り返す必要があります。これは、あなたの更新ステートメントで、会社を検索するだけでなく(主キー、私が望む)、以前に読み込まれた金額と「クレジットポイント」についても達成できます。

どちらの方法もメリットがあります。このアプリケーションを終了する前に、これらの概念に精通することをお勧めします。重い荷物があるとすぐに、間違ったことがあれば、金額とクレジットポイントが誤って計算される可能性があります。

+0

春の取引を使用して私の問題を解決しました。ありがとうございました。 – user2823355

関連する問題