1

Balanceフィールドを保持するAccountテーブルを持つ 1 つの MySql データベース インスタンスがあります。それぞれ Jdbc を使用してデータベースに接続する複数の Java アプリケーションがあり、 Balanceフィールドの値が増減する可能性があります。Balance値が読み取られ、計算され、更新され、このプロセスが分離して行われ、同じことを実行している他の Java プロセスを認識していることを確認するにはどうすればよいですか?

4

3 に答える 3

5

簡単な答えは、トランザクションを使用することです: http://dev.mysql.com/doc/refman/5.0/en/commit.html

ただし、あなたが説明した場合、アカウントの残高をテーブルの列として保存するのではなく、そのアカウントに関連するトランザクションの値を合計して計算することを好みます。発生する整合性の問題に対する感度がはるかに低くなり、あいまいなロック シナリオに遭遇する可能性が低くなります。

于 2011-09-21T08:25:38.257 に答える
2

簡単なアプローチの1つは、JDBCトランザクション管理です。java.sql.Connection.setAutoCommit()ドキュメントを参照してください。これにより、ステートメントの自動コミットを明示的に無効にできます。

Connection c = /* retrieve connection */
c.setAutoCommit(false);
c.setTransactionIsolation(/* depends on your requirements */);
c.executeQuery(/*  */);
c.executeUpdate(/*  */);
c.commit(); /* or c.rollback() */

finally実際のシナリオでは、トランザクションをコミットまたはロールバックするためのブロックを導入する必要があります。そうしないと、データベースでデッドロックが発生する可能性があります。

編集:Javaアプリケーションがエンドユーザークライアントである場合、トランザクション管理ロジックをバイパスして、ユーザーがデータベースに直接接続する(たとえば、Accessを使用する)リスクが常にあります。これが、アプリケーションサーバーを間に配置し始めた理由の1つです。解決策は、クライアントがテーブルとまったく対話しないように、ストアドプロシージャを実装することでもあります。

于 2011-09-21T08:21:58.000 に答える
1

InnoDB エンジンを使用している場合は、MySQL レコード レベルのロックを使用して、他のクライアントからの更新のために特定のアカウント レコードをロックできます。

更新:または、こちらで説明されているアプリケーション レベルのロックを行うこともできます。

于 2011-09-21T08:28:15.993 に答える