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的排它锁释放,所以两个人互相请求,而两个又都不会自动释放,所以就会发生无限期的请求,即死锁。

  • 相关阅读:
    es6 简介
    npm 快速开发技巧
    css清除浮动方法
    mui 总结
    7种 JS 创建对象的经典方式
    JavaScript 的 this 原理
    使用定时器
    dom 操作及方法
    JavaScript的6种继承方式及其优缺点
    贪吃蛇游戏代码
  • 原文地址:https://www.cnblogs.com/pnljs/p/2852558.html
Copyright © 2011-2022 走看看