mysql の update がテーブルをロックする状況は 2 つあります。 1. update にインデックスがない場合、ステートメントの前のトランザクションは commit によって送信され、コマンドは通常どおり実行されて終了します。 update はテーブルをロックします; 2. Update added インデックス作成時にコマンドがスタックすることはなく、テーブルはロックされませんが、同じ行が更新されるため、行はロックされます。
このチュートリアルの動作環境: Windows10 システム、mysql8.0.22 バージョン、Dell G3 コンピューター。
インデックスがない場合、update はテーブルをロックします。インデックスが追加されると、行はロックされます。
前のトランザクションがコミットに合格した場合 送信されると、コマンドは通常どおり実行されて終了し、テーブルがロックされていることを示します。
2 つの状況:
1、インデックスあり
2、インデックスなし
前提の導入:
方法: コマンド ラインを使用して
1.mysq をシミュレートする 自動トランザクション送信がデフォルトで有効になっているため、まず現在のデータベースが有効になっているかどうかを確認する必要があります。 自動コミット取引。
コマンド: select @@autocommit;
結果は次のとおりです:
1 の場合は、コマンドを実行します。 set autocommit = 0; 自動送信を無効に設定します
2。現在のデータベース テーブルの形式は次のとおりです
tb_user | CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(32) DEFAULT NULL, `phone` varchar(11) DEFAULT NULL, `operator` varchar(32) DEFAULT NULL, `gmt_create` datetime DEFAULT NULL, `gmt_modified` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8
明らかに、主キーを除いて、インデックスは追加していません
実際の例:
1. インデックスなし
コマンド begin; を実行してトランザクションを開始し、コマンド update tb_user setphone= を実行します。 11 where name="c1"; 変更するには、最初にトランザクションをコミットしないでください。
別のウィンドウを開いてコマンドを直接実行します: update tb_user set Phone=22 where name="c2"; コマンドがスタックしていることがわかりますが、前のトランザクションがコミットによって送信されると、コマンドは正常に実行され、テーブルがロックされたことを示して終了します。
2. 名前フィールドにインデックスを追加します
create index index_name on tb_user(name);
次に、オープン トランザクションである 1 と同様に操作を続行し、update tb_user setphone=11 を実行します。 name= "c1"; 最初に送信しないでください
その後、 update tb_user setphone=22 where name="c2"; を実行すると、コマンドがスタックしないことがわかり、ロックがないことがわかります。 table
ただし、別の 1 つも更新されている場合は、tb_user setphone=22 where name="c1"; 同じ行を更新し、行がロックされていることを示します
3. 概要
インデックスでない場合、更新によりテーブルがロックされます。インデックスが追加された場合、行はロックされます。
推奨学習: mysqlビデオチュートリアル
以上がmysql で更新するとテーブルがロックされますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。