MySQL のトランザクションはデフォルトで自動的にコミットされます (autocommit = 1)。 しかし、状況によっては問題が発生する可能性があります。たとえば、 一度に 1000 件のレコードを挿入する場合、MySQL は 1000 回コミットします。 自動コミットをオフにして [autocommit = 0]、プログラムを通じて制御すると、必要なコミットは 1 つだけになり、トランザクションの特性をより適切に反映できます。 金額や個数など数値を必要とする演算に! 1つの原則を覚えておいてください:まずロックし、次に判断し、最後に更新します MySQL InnoDBでは、デフォルトのトランザクション分離レベルはREPEATABLE READ(再読み取り可能)です。 SELECT には主に 2 種類の読み取りロックがあります。
トランザクション中に同じデータ テーブルから選択する場合、両方のメソッドは、他のトランザクション データがコミットされるまで実行を待機する必要があります。 主な違いは、1 つのトランザクションが同じフォームを更新しようとすると、LOCK IN SHARE MODE によって簡単にデッドロックが発生する可能性があることです。 簡単に言えば、SELECT 後に同じテーブルを UPDATE する場合は、SELECT ... UPDATE を使用するのが最適です。 例えば: 商品の数量を格納するための商品フォーム products に数量があるとします。注文を行う前に、まず商品の数量が十分かどうか (数量 > 0) を判断し、数量を 1 に更新する必要があります。コードは次のとおりです。 数量を製品から選択します (ID=3)。 数量を 1 に設定します (ID=3)。 製品を更新します (ID=1)。 なぜ安全ではないのですか? 少量の場合は問題ないかもしれませんが、大量のデータにアクセスする場合は必ず問題が発生します。数量 > 0 の場合にのみ在庫を減算する必要がある場合、プログラムが最初の SELECT 行で数量 2 を読み取るとします。数値は正しいように見えますが、MySQL が UPDATE を実行しようとしているときに、誰かがすでに在庫を 0 に減算している可能性がありますが、プログラムはそれに気付かず、エラーなしで UPDATE を続行します。したがって、読み取られて送信されるデータが正しいことを確認するには、トランザクション メカニズムを使用する必要があります。 このように MySQL でテストできます。コードは次のようになります。 SET AUTOCOMMIT=0; BEGIN WORK; SELECT quantity FROM products WHERE id=3 FOR UPDATE; このとき、 製品を更新します。数量を '1' に設定し、ID を 3 に設定します。作業をコミットします。 コミットはデータベースに書き込み、製品のロックを解除します。
MySQL SELECT ... FOR UPDATE 行ロックとテーブルロック 上記では 例えば: id と name の 2 つのフィールドを持つフォーム products があり、id が主キーであるとします。 例 1: (主キーを明示的に指定し、このデータと行をロックする) SELECT * FROM products WHERE id='3' FOR UPDATE; 例 2: (主キーなし、テーブルロック) SELECT * FROM products WHERE name='Mouse' FOR UPDATE; 例3: (主キーが不明、テーブルロック) SELECT * FROM products WHERE id<>'3' FOR UPDATE; 例 4: (主キーが不明、テーブルロック) SELECT * FROM products WHERE id LIKE '3' FOR UPDATE; 楽観的および悲観的なロック戦略 悲観的ロック: データの読み取り時に行をロックし、これらの行に対するその他の更新は、悲観的ロックが終了するまで待機してから続行する必要があります。 楽観的ロック: データの読み取り時にロックは実行されず、更新時にデータが更新されているかどうかが確認され、更新されている場合は現在の更新がキャンセルされます。一般的に、悲観的ロックの待機時間が長すぎて許容できない場合は、楽観的ロックを選択します。 要約する 以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。これについてもっと知りたい場合は、次のリンクをご覧ください。 以下もご興味があるかもしれません:
|
<<: JavaScript の遅延読み込み属性パターンを理解する
>>: Linux リモート コントロール Windows システム プログラム (3 つの方法)
ビンログBinLog は、データベース テーブル構造の変更 (テーブルの作成、変更など) とテーブル...
目次序文MySQL マスタースレーブレプリケーションMySQL でサポートされているレプリケーション...
突然、MySQLにログインすると、アクセスが拒否されたか、データベースに接続できないと表示されました...
Yahoo チームが書いた、ウェブサイトのパフォーマンス最適化に関する記事を読みました。この記事は...
目次1. 背景2. バーチャルリストとは何か3. 関連概念の紹介4. 仮想リストの実装4.1 ドライ...
組合執行分析を簡単にするために、次のSQLを例として使用します。 テーブル t1 を作成します ( ...
<input> はユーザー情報を収集するために使用され、終了ステートメントはありません。...
プロジェクトシナリオ: Dark Horse Vueプロジェクト管理の実践、製品分類の取得、拡張バー...
問題の説明ご存知のとおり、MySQL でフィールドを昇順に並べ替える SQL は次のとおりです (i...
<br />緑は黄色と青(寒色と暖色)の中間の色で、より穏やかな色です。そのため、緑は最...
1 実施原則これは、DOM 要素の dragstart/ondragover/ondrop イベント...
IPツールを取得 lombok.extern.slf4j.Slf4j をインポートします。 org....
前回、非常に熱心なファンから、月を呼吸する光の効果にできるかどうか尋ねられました。月の大きさの写真が...
Ubuntu では中国語入力方法の解決策はありません。仮想マシンや Ubuntu システムをインスト...
この記事では、主にnginxのフロントエンドとバックエンドに同じドメイン名を設定する方法を紹介し、皆...