SQL Server死锁产生原因及解决办法

SQL Server死锁产生原因及解决办法 2006-07-18 05:12:10

分类: SQL Server

  其实所有的死锁最深层的原因就是一个:资源竞争

  表现一:

  一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了,同样用户B要等用户A释放表A才能继续这就死锁了。

  解决方法:

  这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法

  仔细分析你程序的逻辑:

  1:尽量避免同时锁定两个资源

  2: 必须同时锁定两个资源时,要保证在任何时刻都应该按照相同的顺序来锁定资源.

  表现二:

  用户A读一条纪录,然后修改该条纪录。这是用户B修改该条纪录,这里用户A的事务里锁的性质由共享锁企图上升到独占锁(for update),而用户B里的独占锁由于A有共享锁存在所以必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁。

  这种死锁比较隐蔽,但其实在稍大点的项目中经常发生。

  解决方法:

  让用户A的事务(即先读后写类型的操作),在select 时就是用Update lock

  语法如下:

select * from table1 with(updlock) where ....

[@[email protected]]

时间: 2024-10-12 21:09:53

SQL Server死锁产生原因及解决办法的相关文章

SQL数据库损坏的原因和解决办法

现在许多工作人员还在普遍使用SQL SEVER,由于种种原因,SQL数据库会出 现不同程度的损坏,非常影响员工的正常工作.数据的丢失还可能会给公司带 来巨大损失.本文额外大家介绍SQL数据库损坏的原因和解决办法. 当附加数据库文件MDF及日志文件LDF时,报“823”错误.故障出现原因: (1)在数据库读写过程中突然死机或者断电. (2)服务器重启,重启后数据库出现“置疑”状态. (3)磁盘I/O错误 在以上可能的三种突发故障下,由于缓冲数据丢失,数据库无法写入正确 的数据,导致数据结构紊乱,重

SQL Server 2008 错误 233 的解决办法

问题一.忘记了登录Microsoft SQL Server 2008 的sa的登录密码 解决方法:先用windows身份验证的方式登录进去,然后在‘安全性’-‘登录’-右键单击‘sa’-‘属性’,修改密码点击确定就可以了. 问题二.已成功与服务器建立连接,但是在登录过程中发生错取.(provider:共享内存提供程序,error:0-管道的另一端上无任何进程.)(Microsoft SQL Server,错误:233) 解决方法:打开‘程序’-‘所有程序’-‘Microsoft SQL Serv

SQL SERVER 2014 缺少Business Intelligence 解决办法

SQL SERVER 2014安装完所有的数据库工具后,缺少开发工具 Business Intelligence   之解决办法. https://msdn.microsoft.com/en-us/library/bb522628(v=sql.120).aspx https://www.microsoft.com/zh-CN/download/details.aspx?id=36843   visual studio 2012

win 7 下配置SQl server 2008 ODBC 错误的解决办法(端口1433 不通)

win 7安装SQl server 2008 下配置ODBC总是提示类似错误: 上图提示说明可能端口有问题,网上解决办法很多,经过自己的测试筛选解决办法如下: 1. 我们知道sqlserver2008通过端口 1433 连接到主机 localhost 的所以要保证端口1433开放 2.要保证防火墙通过1433端口或者关闭防火墙 3.在运行里 telnet 127.0.0.1 1433  测试提示如下错误    说明要到控制面板\程序\打开或关闭windows功能里勾选 Telnet服务器和客户端

sql server 2008 登录 4064 错误解决办法

出现这个错误是账户无法打开默认数据库导致的 修改一下该账户的默认打开数据库即可. 如果很不幸,你的sa帐号和windows身份验证默认都打开同一个数据库,那么无论换哪种方式登录都是一样没用的 如果你有一个帐号能登录,直接在安全性-登录名那里右键用户名属性修改默认数据库为master即可. 如果2种方式都无法登录,则按下面的命令修改一下sa的默认数据库 如果很不幸,把sa密码给忘记了只能以windows身份验证登录的话,你恰巧又不知道windows登录名的话, 嘎就只能想办法查一下windows身

mysql数据库死锁的产生原因及解决办法

这篇文章主要介绍了mysql数据库锁的产生原因及解决办法,需要的朋友可以参考下 数据库和操作系统一样,是一个多用户使用的共享资源.当多个用户并发地存取数据 时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并 发控制的一个非常重要的技术.在实际应用中经常会遇到的与锁相关的异常情况,当两个事务需要一组有冲突的锁,而不能将事务继续下去的话,就会出现死锁,严 重影响应用的正常执行. 在数据库中有两种基本的锁类型

Oracle死锁产生的原因和解决办法

如果有两个会话,每个会话都持有另一个会话想要的资源,此时就会发生死锁.用下面实验来说明死锁的产生原因和解决办法.SESSION1:SQL> create table t2 as select * from emp;SQL> select * from t2 where empno=7369; EMPNO ENAME      JOB              MGR HIREDATE                 SAL       COMM     DEPTNO---------- ---

Update导致SQL Server死锁的典型方法(转载)

此文为转载文章,描述的很好,没有验证过. 最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: 经过提炼,问题重现的步骤非常简单,在SQL 2008上可以很容易地重现. 1.         首先,创建一张表格,上面有一个clustered index,两个non-clustered index. create table tt(id int iden

Sql语句不能识别Go的解决办法(动态创建表的触发器)

问题来源 用sqlserver直接打开sql文本,执行没问题,但是当用Sqlcommand类执行cmdtext命令文本时总是失败报错. 原因分析及解决 用数据库直接执行sql语句没问题,甚至还可以用Go来进行分批处理,但是当你用链接类访问数据库,并执行sql语句时就有些限制,如下: System.Data.SqlClient.SqlCommand cmd; try { using (System.Data.SqlClient.SqlConnection newconn = new System.