• 死锁产生条件+处理


    死锁产生前置条件:

    1.互斥条件:一个资源只能被一个线程占有

    2.请求与保持条件:一个线程请求资源阻塞,保持已有资源不释放

    3.不剥夺条件:线程间不能强行剥夺

    4.循环等待:多个线程形成首位相接的循环等待资源关系链

    死锁处理方法:

    1.查看死锁进程id,杀掉该进程(一种临时解决方案,总不能在生产环境上排查死锁、Kill sp,我们应该考虑如何去避免死锁)

    查看mysql中,死锁线程:

    2.设置锁超时时间

    mysql:

    复制代码
    # 查询全局等待事务锁超时时间
    SHOW GLOBAL VARIABLES LIKE 'innodb_lock_wait_timeout';
    
    # 设置全局等待事务锁超时时间
    SET  GLOBAL innodb_lock_wait_timeout=100;
    
    
    # 查询当前会话等待事务锁超时时间
    SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';

    超时后抛出CannotAcquireLockException等,可以对异常捕获,利用传播级别为requires_new,假设内层抛出,外层事务可以选择提交

    最核心的是:避免死锁

    打破死锁前置条件中的一条或多条,就可以避免死锁发生

    (1).顺序访问对象,避免出现循环
    (2).减少持有资源的时间(事务简短),减少锁竞争
    (3).使用较低的隔离级别。(比如:读已提交)比使用较(可序列化)持有共享锁的时间更短,减少锁竞争)  

    tip:除这三种较为普通的,还有针对不同数据库层面的设置

     

  • 相关阅读:
    My Eclipse
    那一夜,我被梦中笑醒的事之(数据库)
    KTV项目总结
    欢迎来到,数据库联盟!
    学习手工创建表,表关系以及用exists 来查询
    sql 将Null 值转化成空字符串
    jquery toggle
    推荐一个不错的配色网站
    css之zindex
    关于前后端分离与不分离
  • 原文地址:https://www.cnblogs.com/brxHqs/p/9767558.html
Copyright © 2020-2023  润新知