总结 SQL Server 中死锁产生的原因及解决办法

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 ....

 

时间: 2024-08-22 15:10:53

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

SQLServer中死锁产生的原因及解决办法

server|sqlserver|解决 其实所有的死锁最深层的原因就是一个:资源竞争表现一:一个用户A 访问表A(锁住了表A),然后又访问表B另一个用户B 访问表B(锁住了表B),然后企图访问表A这时用户A由于用户B已经锁住表B,它必须等待用户B释放表B,才能继续,好了他老人家就只好老老实实在这等了同样用户B要等用户A释放表A才能继续这就死锁了解决方法:这种死锁是由于你的程序的BUG产生的,除了调整你的程序的逻辑别无他法仔细分析你程序的逻辑,1:尽量避免同时锁定两个资源2: 必须同时锁定两个资源

SQL Server数据库复制失败的原因及解决方法_MsSql

在SQL Server数据库操作中,对数据库复制时出现了以下的错误,错误信息如下图所示: SQL Server数据库复制失败的原因及解决方案 出现上面的提示信息,会是什么原因导致的呢?笔者经过一番推敲终于找到了上述的原因. 原因:在复制数据库时,必须先停止mssqlserver服务,然后才能复制. 解决方法: 开始-->运行-->services.msc打开服务管理器,找到mssqlserver服务,然后停止该服务. 或者 开始-->运行-->cmd-->net stop m

SQL Server数据库复制失败的原因及解决方法

在SQL Server数据库操作中,对数据库复制时出现了以下的错误,错误信息如下图所示: SQL Server数据库复制失败的原因及解决方案 出现上面的提示信息,会是什么原因导致的呢?笔者经过一番推敲终于找到了上述的原因. 原因:在复制数据库时,必须先停止mssqlserver服务,然后才能复制. 解决方法: 开始-->运行-->services.msc打开服务管理器,找到mssqlserver服务,然后停止该服务. 或者 开始-->运行-->cmd-->net stop m

SQL Server不允许进行远程连接的解决办法

刚刚安装的数据库系统,按照默认安装的话,很可能在进行远程连接时报错,通常是错误:"在连 接到 SQL Server 2005 时,在默认的设置下 SQL Server 不允许进行远程连接可能会导致此失败. (provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server的连接) ",现在针对此 问题总结如下: 明白了SQL Server是个网络数据库就可迎刃而解了,简单的分为下面的几种情况. ◆1.数据库引擎没有启动.有两种启动方式: (1)开始-&g

SQL server 2008 无法连接Local服务器的解决办法

 SQL server 2008 中连接local服务器时,显示无法找到local                 然后打开开始--所有程序--SQL server2008 --配置工具--SQL server配置管理器     打开配置管理器以后,打开SQL server服务,启动SQL server(MSSQLSERVER) 和SQL server 代理(MSSQLSERVER)     然后再打开SQL server网络配置--MSSQLSERVER的协议,启用TCP/IP 然后再次连接l

SQL Server 连接到服务器 错误233的解决办法_mssql2005

我的SQL Server2005 一直正常使用但昨天出现了错误,如图. 经过上网查,网上说的办法试了好多都没有解决这个问题.在经过多次的摸索后终于搞定了,答案很简单,是sql身份验证 "sa"账号 登录密码的问题. 但是前提是你必须得保证你的sql server 的sql 身份验证可以用,所以在这里我们就先给大家讲述下怎样使sql身份验证可以启用 (sql server身份验证可以用的直接跳过这一步). 首先用windows身份验证登录,windows身份验证不可以登录的请看我前面博客

unidac 访问sql server 字符查询参数失效问题及解决办法

     在帮朋友调试kbmmw 服务器的时候,发现用uindac 访问sql server作为后台时,碰见一个问题. 具体如下: cx.Close; cx.sql.add('select * from T where id=:id'); // 这里id 是整数字段 cx.Prepare; cx.ParamByName('id').AsString:='1475'; cx.Open; 这一句运行时不出现错误,但是返回结果为空,很是奇怪. cx.Close; cx.sql.add('select

JDBC连接SQL Server出现的connection refused问题的解决办法

使用JDBC在默认端口1433上连接SQL Server获得connection refused异常,大致异常信息为:The TCP/IP connection to the host  has failed. java.net.ConnectException: Connection refused. 1.使用telnet 127.0.0.1 1433测试,得到如下信息:正在连接到127.0.0.1...不能打开到主机的连接, 在端口 1433: 连接失败表示1433端口没有打开 2.检查SQ

Windows7中下载掉线的原因及解决办法

  下载是我们上网最常做的事情,在Windows 7中使用下载软件下载量,有时会有这样的问题,长时间下载时,就会自动停止下载,下载软件也会处于掉线状态.下面我们来看看在Windows 7中下载掉线的解决办法. 经过多翻搜索.检查后,问题终于搞明白了,原来是网卡电源设置问题造成的. 解决方法如下: 进入Windows7控制面板,依次单击:网络和Internet选→网络和共享→更改适配器设置. 右击"本地连接"选择"属性",打开"属性"对话框,单击&