先上代码connectA:

BEGIN TRAN

UPDATE dbo.Student SET Sorce= WHERE id=
waitfor delay '00:00:05'
SELECT * FROM dbo.Teacher WHERE id= COMMIT TRAN

connectB:

BEGIN TRAN

UPDATE dbo.Teacher SET Age= WHERE Id=
SELECT * FROM dbo.Student WHERE Id= COMMIT TRAN

A的操作:开启事物=》更新表student=》等待5s=》查询表teacher=》提交事物

B的操作:开启事物=》更新表teacher=》查询表student=》提交事物

结果B的操作出现:

Msg 1205, Level 13, State 51, Line 4
Transaction (Process ID 59) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.

意思为:出现死锁,B的连接事务回滚

分析:

现在事务的隔离级别为默认的 READ COMMITTED,该级别排他锁和共享锁是不能同时的。

1.当A连接先执行的时候,更新student表,student表会加一个排他锁,等待5秒。

2.此时执行B的操作,更新teacher表,teacher表会加一个排他锁。然后执行查询表student,查询是添加一个共享锁,但student表已经添加了排他锁,只有等待排他锁的释放。

3.A操作的5s等待完成,执行查询teacher表,teacher表在B连接已经加了排他锁,只能等待teacher表排他锁的释放。

4.这个时候就造成了死锁。

5.系统发现死锁后,会根据配置和系统开销估算。哪个事物回滚,哪个提交。

解决方案:

1.降低事物的隔离等级,一般不用。

2.将与业务逻辑无关的查询放到事物外。

3.在事物中表的操作顺序调整为一致。例如B连接改为:

BEGIN TRAN

SELECT * FROM dbo.Student WHERE Id=5
UPDATE dbo.Teacher SET Age=22 WHERE Id=1

COMMIT TRAN

sql 死锁的更多相关文章

  1. [翻译]:SQL死锁-死锁排除

    As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...

  2. [SQL]死锁处理语句

    原文:[SQL]死锁处理语句 引言 今天在群里看到分享的解决死锁的sql语句,就想着这东西以后肯定用的着,就下载下来,在这里记录一下,以后查找也方便. SQL SET QUOTED_IDENTIFIE ...

  3. SQL死锁知识及解决办法

    [翻译]:SQL死锁-死锁排除 min.jiang 2014-03-18 00:23 阅读:874 评论:1     项目中死锁的解决经历 min.jiang 2014-03-17 01:09 阅读: ...

  4. [翻译]:SQL死锁-阻塞探测

    到了这篇,才是真正动手解决问题的时候,有了死锁之后就要分析死锁的原因,具体就是需要定位到具体的SQL语句上.那么如何发现产生死锁的问题本质呢?下面这篇讲的非常细了,还提到了不少实用的SQL,但对我个人 ...

  5. [翻译]:SQL死锁-阻塞

    一般情况下死锁不是一步到位的,它必须满足特定的条件,然后形成资源的循环依赖才会产生死锁,死锁之前一定会出现阻塞,由阻塞升级才有可能出现死锁,所以我们有必要了解系统中都有哪些已经被阻塞的锁. 我在解决共 ...

  6. [翻译]:SQL死锁-锁与事务级别

    其实这一篇呢与解决我项目中遇到的问题也是必不可少的.上一篇讲到了各种锁之间的兼容性,里面有一项就是共享锁会引起死锁,如何避免呢,将我们的查询都设置中read uncommitted是否可行呢?其结果显 ...

  7. [翻译]:SQL死锁-锁的类型

    很久没有写博客了,这里面的原因有很多.最近的一个项目由于客户明确提出要做下性能压力测试,使用的工具就是VS自带的压力测试工具.以前其它项目做压力测试后反馈的其中一个重要问题就是数据库的死锁.没想到我们 ...

  8. SQL死锁操作

    这两天数据库经常被锁,所以记录一下操作: 查看被锁表:select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) ...

  9. SQL 死锁进程查询

    use master go declare @spid int,@bl int DECLARE s_cur CURSOR FOR ,blocked ) a ) b where a.blocked=sp ...

  10. SQL死锁

    我们操作数据库大量数据时,可能会出现死锁现象. 所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统 ...

随机推荐

  1. 专题1-MMU-lesson3-MMU配置与使用

    1.段方式MMU 利用虚拟地址然后找到物理地址,通过物理地址访问到led,其过程如下: 一个段的大小是[19:0]总共有1M的地址空间. 从上面可知对应GPIO的段物理基地址是0x7f000000.那 ...

  2. C++函数后面加throw关键字简记

    看代码时候看到fun() throw()的用法,找到一篇blog解释很简单,如下: C++函数后面加关键字throw(something)限制,是对这个函数的异常安全性作出限制. 举例及解释如下: v ...

  3. libtool: syntax error near unexpected token `]*

    ../libtool: line 543: syntax error near unexpected token `]*' ../libtool: line 543: `      *[\[\~\#\ ...

  4. 处理iOS设备的屏幕旋转

    某些情况下,不强制的给用户唯一的屏幕角度给用户.这样用户可以旋转手机得到不同的视觉体验. 最简单的就是safari,横看竖看都可以. 这时需要捕捉用户的屏幕旋转事件并处理.很简单,才两步.比把大象装冰 ...

  5. 编写高质量代码改善C#程序的157个建议——建议23:避免将List<T>作为自定义集合类的基类

    建议23:避免将List<T>作为自定义集合类的基类 如果要实现一个自定义的集合类,不应该以一个FCL集合类为基类,反而应扩展相应的泛型接口.FCL结合类应该以组合的形式包含至自定义的集合 ...

  6. 打开Word 2010 老提示安装 Office single image 2010

    解决办法: WScript.Echo "Try to repair registry key..."  'verify Office version  Set objshell = ...

  7. Xcode打包提交至itunes connect后,提交审核成功,随后出现二进制文件无效

    1.问题描述 Xcode打包提交至itunes connect后,提交审核成功,应用处于待审核状态,过了大概半个小时状态更改为二进制文件无效 2.原因分析 2.1 登陆在苹果中预留的邮箱 ---- 邮 ...

  8. JSON Assertion(JSON断言)

    JSON断言允许你完成对JSON文档的校验,首先,如果如果数据不是JSON,则会解析失败:其次,JMeter会用指定语法寻找指定的path,如果没有找到,则会失败:第三,如果验证期望值为null,JM ...

  9. jQuery定位导航滚动3

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. IIS发布的网页上传文件被拒绝

    在IIS所在的服务器共享的权限(如下图示,但注意不是加everyone)和共享文件夹的权限里都加上IIS_USER完全控制,如果不行再加上NETWORK SERVICE权限