sql >> データベース >  >> RDS >> Mysql

行を削除するMySQLのデッドロック

    DMLを実行する場合 操作、InnoDB スキャンされた、一致しないすべての行をロックします。

    このテーブルレイアウトを検討してください:

    DROP TABLE t_tran;
    
    CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;
    
    DROP TABLE t_tran;
    
    CREATE TABLE t_tran (id INT NOT NULL PRIMARY KEY, data INT NOT NULL, KEY ix_tran_data (data)) Engine=InnoDB;
    
    INSERT
    INTO    t_tran
    VALUES
    (1, 1),
    (2, 2),
    (3, 3),
    (4, 4),
    (5, 5),
    (6, 6),
    (7, 7),
    (8, 8);
    
    START TRANSACTION;
    
    DELETE
    FROM    t_tran
    WHERE   data = 2
            AND id <= 5;
    

    この場合、MySQL RANGEを選択します idのアクセスパス 、REFよりも安いと見なされます data

    コンカレントトランザクションでは、行6を削除または更新できます。 、78 行ではありません1 5へ ロックされているため(2の行のみであるにもかかわらず 影響を受けました。

    id <= 5を削除した場合 上記の条件から、行3以外の行を削除できます。 。

    残念ながら、MySQLを制御することはできません DMLのアクセスパス 操作。

    最善の方法は、条件に適切なインデックスを付けて、MySQLを期待することです。 これらのインデックスを選択します。



    1. ユーザーが受け取ったすべての助成金を一覧表示するにはどうすればよいですか?

    2. PHPmysqlの順序付け行

    3. セットのどのIDがテーブルに存在しないかを確認します

    4. CloudSQLからAWSRDSへのMySQLデータベースの移行