ホームページ >データベース >mysql チュートリアル >MySQL データベースのフィールド増分中の競合状態を軽減するにはどうすればよいですか?

MySQL データベースのフィールド増分中の競合状態を軽減するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-13 13:07:02292ブラウズ

How Can You Mitigate Race Conditions During Field Incrementation in MySQL Databases?

MySQL データベースのフィールド増分中の競合状態の軽減

複数の接続が同時更新のために同じ MySQL データベース レコードにアクセスするシナリオでは、競合状態が発生し、意図しない不正確な更新につながる可能性があります。これは、両方の接続が同じフィールド値 (カウンターなど) を取得し、それを増分し、それぞれの増加した値でレコードを更新するときに発生する可能性があります。両方の接続が独立して動作するため、最終的に更新された値には、意図した複数の増分ではなく、単一の増分のみが反映される場合があります。

この問題に対処するために、MySQL はさまざまなアプローチを提供しています。

アトミック アップデート

アトミック更新を利用すると、フィールドの増分が瞬時かつアトミックに発生するようにできます。これは、以下に示すように、フィールドをインクリメントする単一のクエリを通じて実現できます。

update table set tries=tries+1 where condition=value;

行ロック

行ロックは、もう 1 つの実行可能なソリューションです。この手法を採用すると、接続は更新中の行をロックできます。これにより、一度に 1 つの接続だけが行を変更できるようになり、競合状態が排除されます。行ロックと組み合わせて、サポートのために MyISAM テーブルではなく InnoDB テーブルを使用することをお勧めします。行ロックを使用したサンプル クエリは次のようになります。

select tries from table where condition=value for update;
.. do application logic to add to `tries`
update table set tries=newvalue where condition=value;

バージョン スキーム

広く使用されているアプローチは、データベース テーブルにバージョン列を導入することです。このバージョン列はレコードの変更を追跡し、競合状態の検出に役立ちます。このアプローチのクエリは通常、次のパターンに従います。

select tries,version from table where condition=value;
.. do application logic, and remember the old version value.
update table set tries=newvalue,version=version + 1 where condition=value and version=oldversion;

更新が失敗するか、影響を受ける行が返されない場合、別の接続が同時にテーブルを更新したことを意味します。このような場合、更新された値の取得、アプリケーション ロジックの実行、更新の再試行など、プロセスを再起動する必要があります。

以上がMySQL データベースのフィールド増分中の競合状態を軽減するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。