ホームページ >データベース >mysql チュートリアル >MySQL でフィールドをインクリメントするときに競合状態を防ぐにはどうすればよいでしょうか?

MySQL でフィールドをインクリメントするときに競合状態を防ぐにはどうすればよいでしょうか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-19 14:39:02681ブラウズ

How can we prevent race conditions when incrementing fields in MySQL?

MySQL データベースのインクリメント操作での競合状態への対処

MySQL データベースでは、複数の接続が同じフィールドを同時に更新しようとすると競合状態が発生し、潜在的に一貫性のない結果。たとえば、2 つの接続が同時に「試行」カウンタをインクリメントした場合、結果は「試行 2」ではなく「試行 1」のみになる可能性があります。

競合状態を回避するソリューション

競合状態を防ぐには状況に応じて、いくつかのアプローチを使用できます。

アトミック更新:

アトミック更新ステートメントを使用すると、インクリメント操作がアトミックに実行されることが保証され、競合状態が防止されます。例:

UPDATE table SET tries = tries + 1 WHERE condition = value;

行ロック:

別のアプローチは、InnoDB テーブルで行ロックを使用することです。これにより、更新中に行にアクセスしようとする他のクエリは、更新が完了するまで強制的に待機するようになります。クエリは次のようになります。

SELECT tries FROM table WHERE condition = value FOR UPDATE;
-- Application logic to add to tries
UPDATE table SET tries = newvalue WHERE condition = value;

バージョン スキーム:

バージョン スキームは、テーブルにバージョン列を導入します。その後、更新は古いバージョンの値に基づいて条件付けされ、バージョンが最初に読み取られてから変更されていない場合にのみ更新が適用されるようにすることで、競合状態を防ぎます。クエリは次のようになります。

SELECT tries, version FROM table WHERE condition = value;
-- Application logic and old version storage
UPDATE table SET tries = newvalue, version = version + 1 WHERE condition = value AND version = oldversion;

更新が失敗した場合、最初の読み取り以降テーブルが更新されたことを示し、プロセスの再起動が必要になります。

以上がMySQL でフィールドをインクリメントするときに競合状態を防ぐにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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