1-死锁是什么?
死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,
若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.
2-如何解决?
1-解决死锁: kill 进程id
SELECT CONCAT_WS
('','kill',' ',t
.trx_mysql_thread_id
,';')a
FROM information_schema
.INNODB_TRX t
;
2-设计和SQL调整等措施减少锁冲突和死锁 (参考: https://www.cnblogs.com/sessionbest/articles/8689082.html)
l 尽量使用较低的隔离级别;
l 精心设计索引,并尽量使用索引访问数据,使加锁更精确,从而减少锁冲突的机会;
l 选择合理的事务大小,小事务发生锁冲突的几率也更小;
l 给记录集显示加锁时,最好一次性请求足够级别的锁。比如要修改数据的话,最好直接申请排他锁,而不是先申请共享锁,修改时再请求排他锁,这样容易产生死锁;
l 不同的程序访问一组表时,应尽量约定以相同的顺序访问各表,对一个表而言,尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会;
l 尽量用相等条件访问数据,这样可以避免间隙锁对并发插入的影响;
l 不要申请超过实际需要的锁级别;除非必须,查询时不要显示加锁;
l 对于一些特定的事务,可以使用表锁来提高处理速度或减少死锁的可能。
其它的time_out参数
show global variables like “%timeout%”;
connect_timeout
在获取链接时,等待握手的超时时间,只在登录时有效,登录成功这个参数就不管事了。
主要是为了防止网络不佳时应用重连导致连接数涨太快,一般默认(10s)即可。
delayed_insert_timeout
这是为MyISAM INSERT DELAY设计的超时参数,在INSERT DELAY中止前等待INSERT语句的时间。
innodb_lock_wait_timeout
事务遇到锁等待时的Query超时时间。跟死锁不一样,
InnoDB一旦检测到死锁立刻就会回滚代价小的那个事务,
锁等待是没有死锁的情况下一个事务持有另一个事务需要的锁资源,
被回滚的肯定是请求锁的那个Query。
innodb_rollback_on_timeout
这个参数关闭或不存在的话遇到超时只回滚事务最后一个Query,打开的话事务遇到超时就回滚整个事务。
interactive_timeout / wait_timeout
wait_timeout -- 非交互模式链接,MySQL在等待一个非活动连接关闭连接前等待的秒数,
一个连接长时间没有访问,则关闭连接,默认为8小时。
interactive_timeout -- 交互模式链接,MySQL在等待一个活动连接关闭连接前等待的秒数,
默认为8小时。
一个链接的是否是交互模式则取决于客户端链接mysql时传递的参数。
wait_timeout的值会以interactive_timeout为准,
如果wait_timeout设置的值大于interactive_timeout,
那么interactive_timeout值将覆盖wait_timeout。
例如:wait_timeout = 86400,interactive_timeout = 2800;
重启后,虽然配置文件的值不会变,但是执行show variables的wait_timeout会显示2800。
一般,两者的值设置相同就可以。
lock_wait_timeout
sql语句请求元数据锁(MDL)的最长等待时间,默认为一年。
https://blog.csdn.net/qq_42327755/article/details/108865857
net_read_timeout / net_write_timeout
mysql服务器端等待从客户端读取数据 / 向客户端写入数据的最大时限,默认30秒。
slave_net_timeout
mysql从复制连结等待读取数据的最大时限,默认3600秒。