如何减少SQL Server死锁发生

发布时间:2022-07-21 07:34:02 作者:jjj0064_cn 阅读量:7776

    死锁是指在某组资源中,两个或两个以上的线程在执行过程中,在争夺某一资源时而造成互相等待的现象,若无外力的作用下,它们都将无法推进下去,死时可能会产生死锁,这些永远在互相等待的进程称为死锁线程。简单的说,进程A等待进程B释放他的资源,B又等待A释放他的资源,这样互相等待形成死锁。
    如在数据库中,如果需要对一条数据进行修改,首先数据库管理系统会在上面加锁,以保证在同一时间只有一个事务能进行修改操作。如事务1的线程 T1具有表A上的排它锁,事务2的线程T2 具有表B上的排它锁,并且之后需要表A上的锁。事务2无法获得这一锁,因为事务1已拥有它。事务2被阻塞,等待事务1。然后,事务1需要表B的锁,但无法获得锁,因为事务2将它锁定了。事务在提交或回滚之前不能释放持有的锁。因为事务需要对方控制的锁才能继续操作,所以它们不能提交或回滚,这样数据库会发生死锁了。
    如在编写存储过程的时候,由于有些存储过程事务性的操作比较频繁,如果先锁住表A,再锁住表B,那么在所有的存储过程中都要按照这个顺序来锁定它们。如果无意中某个存储过程中先锁定表B,再锁定表A,这可能会导致一个死锁。而且死锁一般是不太容易被发现的。
    如果服务器上经常出现这种死锁情况,会降低服务器的性能,所以应用程序在使用的时候,我们需要对其进行跟踪,使用sp_who和sp_who2来确定可能是哪些用户阻塞了其他用户
    所以我们在数据库设计的时候,虽然不能完全避免死锁,但可以使死锁的数量尽量减少。增加事务的吞吐量并减少系统开销,因为只有很少的事务,所以得遵循下面的原则:
    按同一顺序访问对象
    如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。在写SQL语句或存储过程的时候,需要按照顺序在两个并发事务中先获得表A上的锁,然后获得表B上的锁,当个事务完成之前,另一个事务被阻塞在表A上。个事务提交或回滚后,第二个事务继续进行,而不能在语句里面写先获得表B上的锁,然后再获得表A的锁。
    避免事务中的用户交互
    避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去做别的事了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。
    保持事务简短并在一个批处理中
    在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也越长,从而堵塞了其它活动并可能导致死锁。保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。
    使用低隔离级别
    确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。
    使用绑定连接
    使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。
    下面有一些对死锁发生的一些建议:
    1)对于频繁使用的表使用集簇化的索引;
    2)设法避免一次性影响大量记录的T-SQL语句,特别是INSERT和UPDATE语句;
    3)设法让UPDATE和DELETE语句使用索引;
    4)使用嵌套事务时,避免提交和回退冲突;
    5)对一些数据不需要及时读取更新值的表在写SQL的时候在表后台加上(nolock),如:Select * from tableA(nolock)

***本网站图片,文字之类版权申明,因为网站可以由注册用户自行上传图片或文字,本网站无法鉴别所上传图片或文字的知识版权,如果侵犯,请及时通知我们,本网站将在第一时间及时删除。

我要评论

网友评论


评论时间:2024-05-21 12:25:02

服务器租用哪一家好呢?目前市场上主要有两种服务器类型:1.x86服务器美国云主机购买 2.ARM服务器终身免费云服务器 类型:1.x86服务器2.ARM服务器


评论时间:2022-09-19 18:25:02

根据IDC数据显示,2018年上半年,全球服务器出货量排名前五的厂商分别为戴尔、惠普、IB怎么在虚拟主机里搭建网站 M、联想、浪潮云主机电脑能不能安装打印机 全球服务器出货量排名前五的厂商分别为戴尔、惠普、IBM、联想、浪潮


评论时间:2022-07-26 09:25:01

形成了一批具有一定影响力的领军企独立云主机有什么好处 业有什么比较便宜的云主机 力的领军企业

最新文章

 2023-12-25 22:44:35   admin

活动发布区版规

 2023-05-27 22:03:52   御风而行

容器、无服务器、虚拟机:安全性差...

 2023-05-27 19:08:41   小绵羊0123

科技巨头布局云端 服务器 网络硬...

 2023-05-27 18:17:46   姐姐的跟屁虫

钉钉因系统访问流量激增,宕机1小...

热门阅读

 2022-07-23 00:34:02   freeatom

常见ftp命令 FTP命令使用详...

 2022-07-21 02:17:02   ares

双硬盘组建Raid0磁盘阵列图文...

 2022-07-20 06:17:02   mankeung123

用友软件客户端连接不上服务器的解...

 2022-07-23 00:51:02   antonfxb

WebService实例

 2022-07-13 05:38:02   苯小孩

开发、运维不可不看的Linux调...

 2022-07-20 18:51:02   nightstone

如何使用Charles抓取Web...

随机文章

 2021-12-29 05:38:02   chinalanboo

服务器为什么要放机房

 2022-01-30 05:38:02   powerdream

如何设置不支持基于域名虚拟主机的...

 2022-03-08 05:38:02   ffffdsafda

添加DFS复制组

 2022-07-03 05:38:02   司空摘性

5种最常用的黑客工具及防御方法

 2022-07-19 09:00:04   dh365

服务器教程之Linux服务器配置

 2022-07-19 09:51:02   99225

Squid代理服务器原理

热评文章

 2022-07-19 20:17:02   dengyu0429

linux vi使用及详细介绍

 2022-07-20 01:00:05   激动的舌头

Linux视频教程:用户管理命令...

 2022-07-21 20:51:02   jessica-an

创建本地FTP站点

 2022-02-07 05:38:03   jasonkidd

WEB服务器配置详解

 2022-07-20 04:51:02   wolfssss

ACL权限-默认与递归(4)

 2022-07-22 15:00:05   淡水珊瑚

Linux下 Samba Ser...
全球云服务器
Catfish(鲶鱼) Blog V 4.7.3