0

mysqlで、テーブルの1つの列を更新したいとしましょう。レコードを選択して値を変更する必要があります。その後、更新してデータベースに戻します。場合によっては、これら 2 つの操作を 1 つの SQL クエリで実行できず、それらをサブクエリにネストすることができませんでした (mysql の制限のため)。それをプログラム (Java としましょう) にロードし、値を変更してから、元に戻す必要があります。データベース。

たとえば、プログラム A が列の値を取得し、それを 1 増やしてから元に戻したいとします。同時に、プログラム B も同じことをしたいと考えています。プログラムAが増加した値を戻す前に、プログラムBはすでに間違った値を取得しています(プログラムBはプログラムAによって増加された値を取得するはずですが、プログラムAと同時に実行されるため、プログラムAと同じ値を取得しましたA)。

今私の質問は、この種の問題を処理する良い方法は何ですか?

私のもう 1 つの質問は、mysql はシングル スレッド システムであってはならないと思いますが、2 つの同じクエリ (同じテーブル、同じ列、同じレコードを更新している) が同時に入ってきたとします。このような状況を処理しますか?どの mysql が最初にスケジュールされ、どちらが後でスケジュールされますか?

さらに、マルチスレッドのサポートで mysql がどのように機能するかを誰かが少し説明できますか? 1 つの接続と 1 つのスレッド?その接続で作成されたすべてのステートメントは、同じキューでスケジュールされますか?

4

1 に答える 1

1

InnoDB を使用している場合は、トランザクションを使用して、きめの細かい相互排除を提供できます。

MyISAM を使用している場合は、LOCK TABLEA が変更を完了するまで B がテーブルにアクセスできないようにするために使用できます。

2 つのクライアントが同じフィールドを同時に更新しようとした場合、どちらが競争に勝つかは予測できません。データベースには、2 つのクエリをシリアル化するための内部的な相互排除がありますが、特定の順序は基本的にランダムです。

于 2013-09-21T14:30:22.637 に答える