死锁的形成以及处理

Posted 梨窝★浅笑

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了死锁的形成以及处理相关的知识,希望对你有一定的参考价值。

一、死锁原理

      a、根据操作系统中的定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。

二、死锁的四个必要条件:
     a、互斥条件(Mutual exclusion):资源不能被共享,只能由一个进程使用。
     b、请求与保持条件(Hold and wait):已经得到资源的进程可以再次申请新的资源。
     c、非剥夺条件(No pre-emption):已经分配的资源不能从相应的进程中被强制地剥夺。
     d、循环等待条件(Circular wait):系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。

三、避免死锁

     a、按同一顺序访问对象。

     b、避免事务中的用户交互。

     c、保持事务简短并处于一个批处理中。

     d、使用较低的隔离级别。

四、查看死锁例句

     开两个查询窗口,分别执行下面两段sql

     BEGIN tran
          UPDATE a SET dd=dd+1

          WaitFor Delay ‘00:01:00‘;
          SELECT * FROM B

      ROLLBACK tran

      技术分享

     BEGIN tran 
        UPDATE B SET age=age+1 
        WaitFor Delay ‘00:01:00‘;
        SELECT * FROM A     
    ROLLBACK tran

   技术分享

   五、针对上面语句出现死锁情况的解决方法

         a、根据上面提到的按同一顺序访问对象(调换一下update跟select 执行顺序)

        BEGIN tran 
            SELECT * FROM A    --将select语句放在前,update语句放在后
            WaitFor Delay ‘00:00:30‘;
            UPDATE B SET age=age+1     
       ROLLBACK tran

       技术分享

        b、在SELECT语句加With(NoLock),加With(NoLock)可能会导致脏读。

         BEGIN tran 
             UPDATE B SET age=age+1
             WaitFor Delay ‘00:00:10‘;
             SELECT * FROM A WITH(NOLOCK)    --select语句上加上with(NOLOCK),有效的避免了死锁
         ROLLBACK tran

          技术分享

         还是示例一中的语句,只是加上了WITH(NOLOCK)   

          BEGIN tran
                UPDATE a SET dd=dd+1

                WaitFor Delay ‘00:00:10‘;
                SELECT * FROM B WITH(NOLOCK)

          ROLLBACK tran

          结果:

          技术分享

         c、在sql语句前加上SET LOCK_TIMEOUT,数据默认LOCK_TIMEOUT时间是10分钟

    BEGIN tran
      SET LOCK_TIMEOUT 3000

      UPDATE a SET dd=dd+1

      --WaitFor Delay ‘00:00:10‘;
      SELECT * FROM B

    ROLLBACK tran

          技术分享--3秒钟就会终止当前SQL的执行,不会影响后面的执行效率

 

         

 

        

 

    

以上是关于死锁的形成以及处理的主要内容,如果未能解决你的问题,请参考以下文章

死锁产生的条件以及解决方法

死锁的概念以及发生死锁的缘由

死锁处理

在执行读取/更新的 MS SQL 存储过程上获取死锁(放置代码来处理死锁)

死锁的概念以及处理方式

处理sql server的死锁 [kill spid]