zoukankan      html  css  js  c++  java
  • 死锁sql

    这样的语句会发生死锁哟:
    CREATE TABLE Lock1(C1 int default(0));
    --查询一:
    BEGIN TRAN  
    INSERT INTO Lock1 VALUES(10)    
    WAITFOR DELAY '00:00:05'  
    SELECT * FROM Lock1 WHERE C1 = 10
    COMMIT TRAN

    --查询二:(这个语句要与上一个查询不在同一个查询窗口中)
    BEGIN TRAN  
    INSERT INTO Lock1 VALUES(20)    
    WAITFOR DELAY '00:00:04'  
    SELECT * FROM Lock1 WHERE C1 = 20 
    COMMIT TRAN

    解释一下,为什么会发生死锁:
    这就好比两个人(A,B两人)分别去运行这两个语句(前后不要超过1S钟),这就相当于并发了。A运行了查询一后,在等待的时间内,B运行了查询二,A,B执行完插入语句后都进入等待时间,这时A,B两人都获取了对Lock1的排它锁(不懂的自己去查),当运行到后面的查询语句时,A,B都请求获取Lock1表的共享锁,但A要想获取Lock1的共享锁,就必须等待B的排它锁释放,而B要想获取Lock1的共享锁,也必须等待A的排它锁释放,所以两个人互相请求,而两个又都不会自动释放,所以就会发生无限期的请求,即死锁。

  • 相关阅读:
    Sql的基础知识(一)
    Django--分页功能
    django--基础操作
    CSRF攻击与防御(转载)
    谈谈CSRF
    浅谈Dom遍历
    node50行代码实现壁纸爬取
    node解决request中文乱码问题
    数组去重方法(转载)
    淘宝dns解析错误导致首页打不开
  • 原文地址:https://www.cnblogs.com/pnljs/p/2852558.html
Copyright © 2011-2022 走看看