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 つの方法)
データ型が datetime であるフィールド add_time を持つテーブル product が...
1. ユーザーを作成して承認するMySQL 8.0 では、ユーザーの作成と認証が以前とは異なります...
この記事では、MySQL インストールの詳細なチュートリアルを記録し、全員と共有します。 1. バー...
オンラインで検索して重複データを削除し、ID が最小のデータだけを残します。方法は次のとおりです。 ...
目次序文解析パラメータURLパラメータを変更する要約する序文URLオブジェクトはページ側ではあまり使...
mysqldump バックアップは、その独自の特性 (テーブルのロック、基本的に挿入スクリプトまたは...
私は長い間この問題に悩まされていましたが、検索してみたところ、実際にこの問題を解決した人がいることが...
コードをコピーコードは次のとおりです。 <!DOCTYPE html PUBLIC "...
フロントエンドのクロスドメイン問題に2日間近く悩まされましたが、ようやくngnxを使って解決したので...
プロフェッショナルな Web デザインは複雑で時間がかかります。 HTML と CSS フレームワー...
目次依存関係をインストールする構成使用1.アイコン検索ページに入る2. 使用したいアイコンの英語名を...
123WORDPRESS.COM HTML チュートリアル セクションに戻るには、ここをクリックして...
1. flex-direction: (要素の配置方向) ※ flex-direction:row ...
最近はビッグデータで遊んでいます。友人が私のところに来て、オンラインの Tomcat が不可解に終了...
目次問題の説明一般的な機能効果は次のとおりです。思考分析完全なコード要約する問題の説明Teambit...