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

MySQLにインテンションロックを挿入するためのソリューション

    このデッドロックエラーは、MySQL InnoDBエンジンのバグであり、12年間修正されていません。 (バグ#25847: https://bugs.mysql.com/bug.php? id =25847 、回避策:まだ存在しないInnoDB行をロックするにはどうすればよいですか? )一意キーとは関係ありません。このクエリを実行すると、同じデッドロックエラーが発生します。

    Session #1: CREATE TABLE t (id int) ENGINE=InnoDB;
    Session #1: SET AUTOCOMMIT = 0;
    Session #1: SELECT id FROM t WHERE id = 1 FOR UPDATE;
    Session #2: SET AUTOCOMMIT = 0;
    Session #2: SELECT id FROM t WHERE id = 2 FOR UPDATE;
    Session #1: INSERT INTO t (id) VALUES (1); -- Hang
    Session #2: INSERT INTO t (id) VALUES (2); -- Session #1: OK, Session #2: Deadlock found when trying to get lock; try restarting transaction
    

    InnoDBのステータスは同じです:

    ------------------------
    LATEST DETECTED DEADLOCK
    ------------------------
    2019-10-24 00:25:31 0x1638
    *** (1) TRANSACTION:
    TRANSACTION 1287, ACTIVE 62 sec inserting
    mysql tables in use 1, locked 1
    LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s)
    MySQL thread id 7, OS thread handle 9444, query id 143 localhost ::1 root update
    INSERT INTO t (id) VALUES (1)
    *** (1) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 23 page no 3 n bits 72 index GEN_CLUST_INDEX of table `test`.`t` trx id 1287 lock_mode X insert intention waiting
    Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
     0: len 8; hex 73757072656d756d; asc supremum;;
    
    *** (2) TRANSACTION:
    TRANSACTION 1288, ACTIVE 19 sec inserting, thread declared inside InnoDB 5000
    mysql tables in use 1, locked 1
    3 lock struct(s), heap size 1136, 2 row lock(s)
    MySQL thread id 9, OS thread handle 5688, query id 145 localhost ::1 root update
    INSERT INTO t (id) VALUES (2)
    *** (2) HOLDS THE LOCK(S):
    RECORD LOCKS space id 23 page no 3 n bits 72 index GEN_CLUST_INDEX of table `test`.`t` trx id 1288 lock_mode X
    Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
     0: len 8; hex 73757072656d756d; asc supremum;;
    
    *** (2) WAITING FOR THIS LOCK TO BE GRANTED:
    RECORD LOCKS space id 23 page no 3 n bits 72 index GEN_CLUST_INDEX of table `test`.`t` trx id 1288 lock_mode X insert intention waiting
    Record lock, heap no 1 PHYSICAL RECORD: n_fields 1; compact format; info bits 0
     0: len 8; hex 73757072656d756d; asc supremum;;
    
    *** WE ROLL BACK TRANSACTION (2)
    


    1. MySQLがAUTO_INCREMENTIDを再利用するのを停止します

    2. SQLServerの@@SERVICENAMEとは何ですか?

    3. Codeigniterのアクティブレコードクエリは、データベースからデータをロードするのに時間がかかりすぎます

    4. MySQLワイルドカード*および%