同時に複数のスレッドのトランザクションの同時実行性に関連する問題。

WBOY
リリース: 2016-06-13 13:23:14
オリジナル
934 人が閲覧しました

同時に複数のスレッド間でのトランザクションの同時実行性の問題。 。

複数のスレッドがトランザクション A を同時に実行しています。 。

トランザクション A にステップ 1 がある場合: あるテーブルの固定レコードを更新することです。 。

質問 1: テーブルの行はロックされ、スレッドは続行 (「実行」または「トランザクションの送信」) する前に、前の行がトランザクションを送信するまで待機する必要がありますか?

トランザクション A にはステップ 2 があります。これは、特定のテーブルに対して INSERT レコードを実行することです。
トランザクション A が送信される前に、ステップ 3 があります。ステップ 2 のデータを比較します。 INSERT レコードが要件を超えている場合は、ロールバックしてください。 。

質問 2: 質問 1 の答えがトランザクションをコミットすることである場合、同時実行が発生した場合、ステップ 3 は役に立たず、検出不可能ですか?答えが実行である場合、同時実行を防ぐことができますか?

質問 3: 問題 2 が解決できない場合、ステップ 2 でレコードを INSERT する前に、このテーブルに対して SELECT FOR UPDATE を実行して行をロックする必要がありますか?これで同時実行の問題は解決されるはずですが、他に方法はありますか?

誰かが私に指導してくれることを願っています、ありがとう。 。 。





-----解決策---------
質問 3: 質問 2 が解決できない場合、手順 2 でレコードを INSERT する前に、このテーブルに対して SELECT FOR UPDATE を実行して行をロックする必要がありますか?これで同時実行の問題は解決されるはずですが、他に方法はありますか?

上では何も言いませんが、この問題が重要です。 更新のためにロックする必要があります。この方法でのみアトミック性が保証されます:

1, query A
2 。 A は条件を満たしており、A を更新します

1 と 2 がアトミックでない場合、A のクエリと A の更新の間に、A を変更する他の操作が発生します。どうすればよいですか? 1と2を全体的にロックするだけです。特にinnodbは行をロックできるので、テーブルを直接ロックするよりも使いやすいです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!