MYSQL 存储过程报错Deadlock found when trying to get lock; try restarting transaction

我使用的都是innodb 表。 存储过程是定时执行的,经常报错Deadlock found when trying to get lock; try restarting transaction。 但是没发现对业务逻辑有什么影响。存储过程的操作的表 经常都会有查询 插入 更新 操作。 请问以上错误如何避免。产生这种死锁的原因,如何有效的避免这种情况的死锁?
求分享一下经验

这个死锁估计是有数据没了, 或者某个操作被回滚了

要避免这个问题方法有很多

    事务尽量不要太复杂

    在使用表或者行的时候, 尽量设定一个顺序, 比如同一时间段线程A 竞争 1 2 资源, 线程 B 竞争 2 1 资源出现死锁, 如果改成 A 使用 1 2 B 也是使用的 1 2 , 这样再差也只会出现线程A/B去等待线程B/A执行完毕再去访问资源

    将一些容易出现死锁的字段改成索引, 这样在竞争资源的时候mysql将不再上锁[doge]

    如果你是mysql数据库, 则尽量避免使用 insert ... select 这样的sql(oracle不用), 因为他会为你需要查询的条件也上锁, 这样也会容易出现死锁的问题

    捕获异常, 然后在出现这个异常的时候再次执行一次死锁的sql语句

    待续, 我也没遇到更多的出现死锁的情况了, 等遇到再说

以上几点如果有错的话, 请指出, 我们相互探讨, 毕竟这也是我从笔记里面找出来的, 可能有错误

温馨提示:答案为网友推荐,仅供参考