先上代码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. mysql_5.6内存过高问题解决

    MySQL 5.6安装完之后,每过一段时间就会莫名其妙挂掉.而且还很难启动.非要重启服务器,才能拉起mysql. 后来分析是由于mysql启动后内存过高,跑一段时间就会由于内存不足而被杀死. 今天分析 ...

  2. sql2008调试存储过程

    拿上篇存储过程为例: 在意个窗口里面写上exec Proc_MoveUpOrDown2 'id',3,1,'tableName,'orderid' 按F11,有个黄色的箭头会指向该行, 再按F11会跳 ...

  3. 编写高质量代码改善C#程序的157个建议——建议46:显式释放资源需继承接口IDisposable

    建议46:显式释放资源需继承接口IDisposable C#中的每一个类型都代表一种资源,资源分为两类: 托管资源:由CLR管理分配和释放的资源,即从CLR里new出来的对象. 非托管资源:不受CLR ...

  4. HttpClient connectionTimeout

    转自:http://www.cnblogs.com/carlosk/archive/2013/03/12/2956502.html 前几天服务器端的产品经理跑来问我是否有做请求超时和响应超时的处理.我 ...

  5. Max Sum(动态规划)

    原创 http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目要求求出一个序列里面的最大序列和,序列要求是连续的,给出最大序列和,序列首元素下标和尾元素下标, ...

  6. 转Delphi中XLSReadWrite控件的使用(1)---简介

    XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...

  7. java多线程的操作

    上篇博客简单了介绍了Java的多线程的概念,与进程的区别,两种创建方式,状态及获取线程名称等内容.这篇文章接着介绍Java的多线程.主要从一下几方面介绍. 1 线程类的常用方法 1.1 start() ...

  8. 数据结构之BF算法,kmp算法,三元组,十字链表总结

    在这一章中,老师教了我们四种数据结构:BF算法,kmp算法,三元组和十字链表:还给我们讲了2019年团体天体赛中T1-8的AI题 1.对于BF和kmp算法,老师除了在课堂上讲解算法的主要核心思想外,还 ...

  9. oracle重新编译所有invalid objects

    点第一个,按住shift键点最后一个,右键recompile就OK了

  10. Mysql的用户基本操作

    创建用户: mysql> create user 'cai'@'localhost' identified by '123456'; Query OK, 0 rows affected (0.0 ...