ホームページ > データベース > mysql チュートリアル > MySQL データベースの更新選択の使用方法

MySQL データベースの更新選択の使用方法

黄舟
リリース: 2016-12-24 17:26:25
オリジナル
3270 人が閲覧しました

Mysql SELECT FOR UPDATE
MySQL は、トランザクションの書き込み前に確認するために SELECT... FOR UPDATE を使用します。
MySQL の InnoDB を例に挙げます。デフォルトの Tansaction 分離レベルは、SELECT メソッドの主な 2 種類です。
SELECT ... LOCK IN SHARE MODESELECT ... FOR UPDATE
これら 2 つのメソッドは、同じデータ テーブルへの SELECT の実行中に、他のトランザクション データが送信される (コミットする) のを待つ必要があります。主な違いは、LOCK IN SHARE MODE では、一方の当事者が同じフォームを更新しようとすると、簡単にデッドロックが発生する可能性があることです。
簡単に言えば、SELECT の後に同じフォームを UPDATE したい場合は、SELECT ... UPDATE を使用するのが最善です。
例: 製品の数量を保存するための製品フォーム製品に数量があるとします。注文が確立される前に、製品の数量が十分であるかどうか (数量 > 0) を判断してから、数量を決定する必要があります。 1に更新されます。
危険な行為:
SELECT数量 FROM products WHERE id=3;
UPDATE products SET数量 = 1 WHERE id=3;
データ量が少ない場合は問題がない可能性があります。のデータが保存されます。 「鉄壁」を選択すると問題が発生します。
数量>0のときに在庫を差し引く必要がある場合、SELECTの最初の行でプログラムによって読み取られた数量が2であると仮定すると、数値は正しいように見えますが、MySQLがUPDATEの準備をしているときに、誰かがすでに移動している可能性がありますインベントリは 0 に減らされましたが、プログラムはそれを認識せず、エラーを更新し続けました。
したがって、読み取られて送信されたデータが正しいことを確認するには、トランザクション メカニズムを使用する必要があります。
MySQL では次のようにテストできます: (注 1)
SET AUTOCOMMIT=0;
SELECT数量 FROM products WHERE id=3 FOR UPDATE; == ==============================
この時、商品データのid=3のデータはロックされています(注 3)、およびその他のトランザクションは、SELECT * FROM products WHERE id=3 FOR UPDATE を実行する前に、このトランザクションがコミットされるまで待機する必要があります (注 2) これにより、他のトランザクションで数量ごとに読み取られた数値が正しいことが保証されます。 ===========================================
UPDATE商品SET数量=' 1' WHERE id=3;
==================================== == =====
コミットがデータベースに書き込まれ、製品のロックが解除されます。
注 1: BEGIN/COMMIT は、トランザクションの開始点と終了点です。ロック ステータスを対話的に観察するには、3 つ以上の MySQL コマンド ウィンドウを使用できます。
注 2: トランザクション中、同じデータに対する SELECT... FOR UPDATE または LOCK IN SHARE MODE のみが、他のトランザクションの完了を待ってから実行されます。通常、SELECT... はこの影響を受けません。
注 3: InnoDB はデフォルトで行レベルのロックに設定されているため、データ列のロックについてはこの記事を参照してください。
注 4: InnoDB フォームでは LOCK TABLES 命令を使用しないようにしてください。使用する必要がある場合は、システムでの頻繁なデッドロックを避けるために、InnoDB での LOCK TABLES の使用に関する公式の手順を読んでください。
MySQLのRow LockとTable Lock SELECT ... FOR UPDATE
上記でSELECT ... FOR UPDATEの使い方を紹介しましたが、ロック(Lock)されたデータを判定するかどうかに注意が必要です。 InnoDB のデフォルトは行レベル ロックであるため、主キーが「明示的に」指定されている場合にのみ、MySQL は行ロック (選択されたデータのみをロック) を実行します。それ以外の場合、MySQL はテーブル ロック (データ フォーム全体をロック) を実行します。
例:
id と name の 2 つのフィールドがあり、id が主キーであるフォーム製品があるとします。
例 1: (主キーを明示的に指定し、このデータがある場合、行ロック)
SELECT * FROM products WHERE id='3' FOR UPDATE;
例 2: (主キーが存在しない場合は、明示的に主キーを指定)データ、ロックはありません)
SELECT * FROM products WHERE id='-1' FOR UPDATE;
例 2: (主キーなし、テーブル ロック)
SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 3: (主キーが不明瞭、テーブル ロック)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
例 4: (主キーが不明瞭、テーブル ロック)
SELECT * FROM products WHERE id LIKE '3' FOR UPDATE;
注 1: FOR UPDATE のみ InnoDB に適用され、有効にするにはトランザクション ブロック (BEGIN/COMMIT) 内にある必要があります。
注 2: ロック状況をテストするには、MySQL のコマンド モードを使用して 2 つのウィンドウを開いてテストできます。

上記は MySQL データベース選択の使用方法の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (www.php.cn) をご覧ください。


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