UPDATE はロックしますか? 以下のような場合、SQL文はロックされますか? テーブル1を更新します。SET num = num + 1 WHERE id=1; 答えはノーだ 実際、MySQL はデータ行のロック (InnoDB) をサポートしており、UPDATE/DELETE 操作中に排他ロックを自動的に追加します。ただし、 UPDATE キーワードがある限り、すべてのロックが適用されるわけではありません。 上記の MySQL ステートメントの場合、1 つの UPDATE ステートメントではなく、2 つの SQL ステートメント (疑似コード) に類似している必要があります。 a = SELECT * FROM table1 WHERE id=1; テーブル1を更新します。SET num = a.num + 1 WHERE id=1; SELECT ステートメントを実行するときにはロックはなく、UPDATE を実行するときにのみロックされます。そのため、同時操作中に更新データの不整合が発生します。原因が見つかれば、問題の解決はそう遠くありません。この種の問題を解決するには 2 つの方法があります。
明示的に選択する SELECT をロックする方法は次の 2 つあります。 SELECT ... LOCK IN SHARE MODE #共有ロック、他のトランザクションは読み取り可能だが更新不可 SELECT ... FOR UPDATE #排他ロック、他のトランザクションは読み取りも書き込みも不可 これら 2 つのステートメントを使用しない場合、SELECT ステートメントはデフォルトでロックされません。また、上記のシナリオでは、排他ロックを使用する必要があります。また、上記の 2 つのステートメントはトランザクション内でのみ有効であり、それ以外の場合は有効になりません。 MySQL コマンドラインでトランザクションを使用する方法は次のとおりです。 AUTOCOMMIT=0 を設定します。 作業を開始します。 a = SELECT num FROM table1 WHERE id=2 FOR UPDATE; テーブル1を更新します。SET num = a.num + 1 WHERE id=2; 仕事をコミットする。 このように、将来データを更新するたびに、このトランザクションを使用して操作を実行します。同時実行の場合は、後で実行されるトランザクションは、現在のトランザクションが完了するまでブロックされます。 (ロックにより並行性が順次実行に変更されます) 楽観的ロックの使用 楽観的ロックは、変更する必要があるすべてのデータが競合しないことを単純に想定したロック実装のメカニズムです。したがって、更新前にデータをロックするのではなく、データ行のバージョン番号のみを照会します (ここでのバージョン番号はカスタム フィールドであり、ビジネス テーブルに基づいて追加フィールドを追加する必要があり、更新されるたびに自動的に増加または更新されます)。 データを更新する場合、更新条件にバージョン番号情報が追加されます。
練習する 学生テーブルに1回更新ロックをかける練習をする。学生テーブルには1つのデータがある。 2つのクライアントを開く 最初のオープントランザクションの後に実行される 更新のために、ID = 1 の学生から名前を選択します。 2 番目のトランザクションが開かれた後、同じステートメントが実行され、データが最初のトランザクションによってブロックされていることがわかります。 この時点で、最初のトランザクションが変更を実行してコミットします。 2番目のトランザクションの選択実行が4秒以上ブロックされていることが判明しました まとめ 一般に、どちらの方法でもデータベースでの同時更新操作をサポートできます。ただし、どちらを使用するかは実際のアプリケーション シナリオによって異なり、アプリケーション シナリオでどちらがより適切にサポートされ、パフォーマンスへの影響が最も少ないかによって異なります。 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MongoDB データベースの状態を監視する Zabbix3.4 メソッド
>>: Ant Design Blazor コンポーネントライブラリのルーティング再利用マルチタブ機能
目次1. トリガーの紹介1. トリガーとは何ですか? 2. トリガーの特徴2. トリガーを作成する1...
今日、新しい技を学びました。あまりやったことがなかったので、今まで知りませんでした...目的: リン...
ステップ1: ディレクトリに入ります: cd /etc/mysql、debian.cnfファイルを表...
目次質問: 1. 最初の試み2. 合理的な分析3. 問題解決(1) pthread_join()の使...
目次1. MySQLでよく使われる文字列関数2. 数値関数3. 日付と時刻の機能4. プロセス機能5...
目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...
ドロップダウン メニューやスライド メニューを使用している Web サイトをたくさん見つけたので、私...
エラーメッセージ:エラー 1862 (HY000): パスワードの有効期限が切れています。ログインす...
<br />構造と階層により複雑さが軽減され、読みやすさが向上します。記事やサイトが整理...
ウェブサイトリンク: http://strml.net/サミュエル・リード著ヒント: 昨日、Mome...
この記事では、WeChatアプレットでビデオプレーヤーの集中砲火を実装するための具体的なコードを参考...
目次コンストラクタインスタンスとプロトタイプの関係プロトタイププロパティ属性またはメンバーの検索原則...
1. はじめに: mysql8以降は、これまでよく使われていたバージョンと比べてかなり変更点が大きい...
今日、研究室のプロジェクトを見ていたとき、私にとって「難しい」問題に遭遇しました。実は、それは私があ...
最近、element-ui を統合したプロジェクトで vuethink を使用しました。以前は bo...