mysql中的死锁

    科技2022-07-11  94

    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秒。
    Processed: 0.031, SQL: 8