首页 » Web前端 » phpmysql事务try技巧_MySQL事务锁问题Lock wait timeout exceededtry restarting

phpmysql事务try技巧_MySQL事务锁问题Lock wait timeout exceededtry restarting

访客 2024-12-19 0

扫一扫用手机浏览

文章目录 [+]

删数据总是删不掉,耗时时间还久,一样平常便是涌现去世锁了。

问题征象:

phpmysql事务try技巧_MySQL事务锁问题Lock wait timeout exceededtry restarting

接口相应韶光超长,耗时几十秒才返回缺点提示,后台日志中涌现Lock wait timeout exceeded; try restarting transaction的缺点

phpmysql事务try技巧_MySQL事务锁问题Lock wait timeout exceededtry restarting
(图片来自网络侵删)

问题场景:

1、在同一事务内先后对同一条数据进行插入和更新操作;

2、多台做事器操作同一数据库;

3、瞬时涌现高并创造象;

问题缘故原由:

1、在高并发的情形下,Spring事物造成数据库去世锁,后续操作超时抛出非常。

2、MySQL数据库采取InnoDB模式,默认参数:innodb_lock_wait_timeout设置锁等待的韶光是50s,一旦数据库锁超过这个韶光就会报错

办理方法:

1、查看数据库当前的进程,看一下有无正在实行的慢SQL记录线程。

mysql> show processlist;

2、查看当前的事务

当前运行的所有事务

mysql> SELECT FROM information_schema.INNODB_TRX;

当前涌现的锁

mysql> SELECT FROM information_schema.INNODB_LOCKs;

锁等待的对应关系

mysql> SELECT FROM information_schema.INNODB_LOCK_waits;

阐明:看事务表INNODB_TRX,里面是否有正在锁定的事务线程,看看ID是否在show processlist里面的sleep线程中,如果是,就证明这个sleep的线程事务一贯没有commit或者rollback而是卡住了,我们须要手动kill掉。

搜索的结果是在事务表创造了很多任务,这时候最好都kill掉。

3、批量删除事务表中的事务

我这里用的方法是:通过information_schema.processlist表中的连接信息天生须要处理掉的MySQL连接的语句临时文件,然后实行临时文件中天生的指令。

mysql> select concat('KILL ',id,';') from information_schema.processlist where user='cms_bokong';+------------------------+| concat('KILL ',id,';') |+------------------------+| KILL 10508; || KILL 10521; || KILL 10297; |+------------------------+18 rows in set (0.00 sec)

当然结果不可能只有3个,这里我只是举例子。
参考链接上是建议导出到一个文本,然后实行文本。
而我是直接copy到记事本处理掉 ‘|’,粘贴到命令行实行了。
都可以。

kill掉往后再实行SELECT FROM information_schema.INNODB_TRX; 便是空了。

这时候系统就正常了

4、直接kill 线程ID

kill 10297;

故障排查

1、mysql都是autocommit配置mysql> select @@autocommit;

如果是0 ,则改为1

mysql> set global autocommit=1;

2、mysql的引擎检讨,可以检讨一下数据库引擎是不是InnoDB(mysql5.5.5以前默认是MyISAM,mysql5.5.5往后默认是InnoDB)show ENGINES; #检讨命令 如果不是的话改为 InnoDB :

查看表利用的存储引擎

show table status from db_name where name='table_name';

修正表的存储引擎

alter table table_name engine=innodb;

标签:

相关文章