博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sqlserver 数据库死锁
阅读量:6971 次
发布时间:2019-06-27

本文共 1716 字,大约阅读时间需要 5 分钟。

  hot3.png

--查询死锁 select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) tableName from sys.dm_tran_locks where resource_type='OBJECT' --杀死单个死锁kill spid--在master中创建删除指定数据库的死锁的存储过程use master  go    if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_killspid]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)  drop procedure [dbo].[p_killspid]  GO    create proc p_killspid  @dbname varchar(200)    --要关闭进程的数据库名  as        declare @sql  nvarchar(500)        declare @spid nvarchar(20)        declare #tb cursor for          select spid=cast(spid as varchar(20)) from master..sysprocesses where dbid=db_id(@dbname)      open #tb      fetch next from #tb into @spid      while @@fetch_status=0      begin            exec('kill '+@spid)          fetch next from #tb into @spid      end        close #tb      deallocate #tb  go --删除该库下的死锁exec master..p_killspid 'dbname'

避免死锁

  1. 按同一顺序访问对象

    如果所有并发事务按同一顺序访问对象,则发生死锁的可能性会降低。例如,如果两个并发事务获得 Supplier 表上的锁,然后获得 Part 表上的锁,则在其中一个事务完成之前,另一个事务被阻塞在 Supplier 表上。第一个事务提交或回滚后,第二个事务继续进行。不发生死锁。将存储过程用于所有的数据修改可以标准化访问对象的顺序。

  2. 避免事务中的用户交互

    避免编写包含用户交互的事务,因为运行没有用户交互的批处理的速度要远远快于用户手动响应查询的速度,例如答复应用程序请求参数的提示。例如,如果事务正在等待用户输入,而用户去吃午餐了或者甚至回家过周末了,则用户将此事务挂起使之不能完成。这样将降低系统的吞吐量,因为事务持有的任何锁只有在事务提交或回滚时才会释放。即使不出现死锁的情况,访问同一资源的其它事务也会被阻塞,等待该事务完成。

  3. 保持事务简短并在一个批处理中

    在同一数据库中并发执行多个需要长时间运行的事务时通常发生死锁。事务运行时间越长,其持有排它锁或更新锁的时间也就越长,从而堵塞了其它活动并可能导致死锁。

    保持事务在一个批处理中,可以最小化事务的网络通信往返量,减少完成事务可能的延迟并释放锁。

  4. 使用低隔离级别

    确定事务是否能在更低的隔离级别上运行。执行提交读允许事务读取另一个事务已读取(未修改)的数据,而不必等待第一个事务完成。使用较低的隔离级别(例如提交读)而不使用较高的隔离级别(例如可串行读)可以缩短持有共享锁的时间,从而降低了锁定争夺。

    1. ALTER DATABASE [dbname]  
    2. SET READ_COMMITTED_SNAPSHOT ON  

使用绑定连接

使用绑定连接使同一应用程序所打开的两个或多个连接可以相互合作。次级连接所获得的任何锁可以象由主连接获得的锁那样持有,反之亦然,因此不会相互阻塞。

转载于:https://my.oschina.net/return/blog/1808130

你可能感兴趣的文章
escape()、encodeURI()、encodeURIComponent()区别详解
查看>>
AgileEAS.NET5.0-界面设计器-使用说明书(上)
查看>>
只为完美强大的Linux——视频通讯功能(附完整代码)
查看>>
比较有用的一个排查sshd的命令
查看>>
Linux运维的8个小时工作时间都做什么
查看>>
mybatis.xml(理解的相对局限)
查看>>
谷歌Quickoffice现免费面向所有用户
查看>>
Mvc Html.BeginForm 方式提交Form前验证
查看>>
温度传感器+I2C+串口+PC上位机(pyserial)例子
查看>>
JFreeChart绘制保存为图片
查看>>
Couchbase学习笔记(3)——.NET应用入门
查看>>
AVI RIFF 文件参考手册
查看>>
昨日终于考完路考了
查看>>
深入理解Tomcat系列之一:系统架构
查看>>
介绍:成为一名 Jenkins 贡献者的旅程
查看>>
还是使用jquery实现的无刷新的文件下载
查看>>
让KVM虚机能使用音箱与麦克风(vnc及ac97)
查看>>
使用idfc-proguard-maven-plugin混淆优化Jave Web工程二
查看>>
tomcat 设置内存
查看>>
怎么一边敲代码还能一边赚点钱,一字一字敲的,不喜勿喷哈,IOS手机看进来...
查看>>