MySql锁等待问题的处理办法

    技术2022-07-10  99

    建表

    CREATE TABLE testdemo ( `id` int(255) NOT NULL , `c1` varchar(300) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL , `c2` int(50) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX `idx_c2` (`c2`) USING BTREE )ENGINE=InnoDB; insert into testdemo VALUES(1,'1',1),(2,'2',2);

    使用一个会话打开并执行一个写锁

    BEGIN SELECT * FROM testdemo WHERE id = 1 FOR UPDATE

    使用另一个会话框,上一个写锁

    BEGIN SELECT * FROM testdemo WHERE id = 1 lock in share mode

    这时另一个会话执行会超时。如果发生在生产环境,可能会觉得纳闷,怎么老是等待超时呢?这时可使用下面语句找到问题的原因

    select * from information_schema.INNODB_LOCKS;

    这时发现同一张表有两个锁,一个是读锁一个是写锁 这时我们可以使用该语句找到进程号,并kill掉它就好

    select * from sys.innodb_lock_waits

    执行下面命令即可解锁

    KILL 7
    Processed: 0.010, SQL: 9