SQL死锁
我们操作数据库大量数据时,可能会出现死锁现象。
所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁。
死锁的四个必要条件
通常都会介绍死锁的四个必要条件。这四个条件缺一不可,或者说只要破坏了其中任何一个条件,死锁就不可能发生。我们来复习一下,这四个条件是:
•互斥(Mutual exclusion):存在这样一种资源,它在某个时刻只能被分配给一个执行绪(也称为线程)使用;
•持有(Hold and wait):当请求的资源已被占用从而导致执行绪阻塞时,资源占用者不但无需释放该资源,而且还可以继续请求更多资源;
•不可剥夺(No preemption):执行绪获得到的互斥资源不可被强行剥夺,换句话说,只有资源占用者自己才能释放资源;
•环形等待(Circular wait):若干执行绪以不同的次序获取互斥资源,从而形成环形等待的局面,想象在由多个执行绪组成的环形链中,每个执行绪都在等待下一个执行绪释放它持有的资源。
检测是否有死锁:
USE [master]
GO DECLARE @return_value int EXEC @return_value = [dbo].[auto_checkblocks] SELECT 'Return Value' = @return_value GO
如果有死锁Return Value的是不是0
直接在sql中执行 Kill ‘Return Value 非0的值’ ,就OK了。
存储过程
use master
go
--sql server性能分析--检测资料库阻塞语句
create PROCEDURE [dbo].[auto_checkblocks] AS
set nocount on
if exists ( select * from master..sysprocesses where blocked <> 0 )
begin
/**//* show top blockers, but no duplicates */
select '请尝试使用KILL [SPID] 来杀进程' select '以下是引起阻塞的语'
select distinct
'进程ID' = str( a.spid, 4 ),
'进程ID状态' = convert( char(10), a.status ),
'分块进 µ{的进 µ{ID' = str( a.blocked, 2 ),
'工作站名称' = convert( char(10), a.hostname ),
'执行命令的用户' = convert( char(10), suser_name( a.uid ) ),
'资料库 ¦W' = convert( char(10), db_name(a.dbid ) ),
'应用程式名' = convert( char(10), a.program_name ),
'正在执 ¦æ的命令' = convert( char(16), a.cmd ),
'累计时间' = str( a.cpu, 7 ),
'IO' = str( a.physical_io, 7 ),
'登录W' = a.loginame,
'执行语'=b.text
from master..sysprocesses a
cross apply sys.dm_exec_sql_text(a.sql_handle) b
where spid in ( select blocked from master..sysprocesses )
and blocked = 0
order by str(spid,4)
/**//* 显示阻塞牺 ¹品*/
select '以下是被阻塞的等待执行的语句'
select
'进程ID[SPID]' = str( a.spid, 4 ),
'进程ID状态' = convert( char(10), a.status ),
'分块进 µ{的进 µ{ID' = str( a.blocked, 2 ),
'工作站名称' = convert( char(10), a.hostname ),
'执行命令的用户' = convert( char(10), suser_name( a.uid ) ),
'资料库 ¦W' = convert( char(10), db_name( a.dbid ) ),
'应用程式名' = convert( char(10), a.program_name ),
'正在执 ¦æ的命令' = convert( char(16), a.cmd ),
'累计时间' = str( a.cpu, 7 ),
'IO' = str( a.physical_io, 7 ),
'登录' = a.loginame,
'执行语'=b.text
from master..sysprocesses a
cross apply sys.dm_exec_sql_text(a.sql_handle) b
where blocked <> 0
order by spid
end
else
begin
select '恭喜!当前没有阻塞,当前的进程资讯如下.', convert (char(24),getdate(),13)
select
'进程ID' = str( spid, 4 ),
'进程ID状态' = convert( char(10), status ),
'分块进 µ{的进 µ{ID' = str( blocked, 2 ),
'工作站名称' = convert( char(10), hostname ),
'执行命令的用户' = convert( char(10), suser_name( uid ) ),
'资料库 ¦W' = convert( char(10), db_name( dbid ) ),
'应用程式名' = convert( char(10), program_name ),
'正在执 ¦æ的命令' = convert( char(16), cmd ),
'累计时间' = str( cpu, 7 ),
'IO' = str( physical_io, 7 ),
'登录 ¦W' = loginame
from master..sysprocesses
where blocked = 0
order by spid
end
SQL死锁的更多相关文章
- [翻译]:SQL死锁-死锁排除
As we already saw, the reasons why we have blocking issues and deadlocks in the system are pretty mu ...
- [SQL]死锁处理语句
原文:[SQL]死锁处理语句 引言 今天在群里看到分享的解决死锁的sql语句,就想着这东西以后肯定用的着,就下载下来,在这里记录一下,以后查找也方便. SQL SET QUOTED_IDENTIFIE ...
- SQL死锁知识及解决办法
[翻译]:SQL死锁-死锁排除 min.jiang 2014-03-18 00:23 阅读:874 评论:1 项目中死锁的解决经历 min.jiang 2014-03-17 01:09 阅读: ...
- [翻译]:SQL死锁-阻塞探测
到了这篇,才是真正动手解决问题的时候,有了死锁之后就要分析死锁的原因,具体就是需要定位到具体的SQL语句上.那么如何发现产生死锁的问题本质呢?下面这篇讲的非常细了,还提到了不少实用的SQL,但对我个人 ...
- [翻译]:SQL死锁-阻塞
一般情况下死锁不是一步到位的,它必须满足特定的条件,然后形成资源的循环依赖才会产生死锁,死锁之前一定会出现阻塞,由阻塞升级才有可能出现死锁,所以我们有必要了解系统中都有哪些已经被阻塞的锁. 我在解决共 ...
- [翻译]:SQL死锁-锁与事务级别
其实这一篇呢与解决我项目中遇到的问题也是必不可少的.上一篇讲到了各种锁之间的兼容性,里面有一项就是共享锁会引起死锁,如何避免呢,将我们的查询都设置中read uncommitted是否可行呢?其结果显 ...
- [翻译]:SQL死锁-锁的类型
很久没有写博客了,这里面的原因有很多.最近的一个项目由于客户明确提出要做下性能压力测试,使用的工具就是VS自带的压力测试工具.以前其它项目做压力测试后反馈的其中一个重要问题就是数据库的死锁.没想到我们 ...
- SQL死锁操作
这两天数据库经常被锁,所以记录一下操作: 查看被锁表:select request_session_id spid,OBJECT_NAME(resource_associated_entity_id) ...
- SQL 死锁进程查询
use master go declare @spid int,@bl int DECLARE s_cur CURSOR FOR ,blocked ) a ) b where a.blocked=sp ...
随机推荐
- sublime package control以及常用插件
一.package Control安装 1.sublime 3 import urllib.request,os; pf = 'Package Control.sublime-package'; ip ...
- form 表单 和 jQuery HTML / CSS 方法($().html 类似的样式)
1 有关链接 :http://www.runoob.com/tags/tag-form.html https://www.cnblogs.com/Jxwz/p/4509618.html https:/ ...
- solr dataimport
solrconfig.xml <requestHandler name="/dataimport" class="org.apache.solr.handler.d ...
- 快速搭建lvs + keepalived + nginx
环境: VIP 192.168.2.224 LVS 192.168.2.217 centos7 nginx1 192.168.2.231 c ...
- Centos7之WEB服务器
1.安装httpd服务 输入命令:yum -y install httpd [root@N37012 ~]# yum -y install httpc Loaded plugins: fastestm ...
- linux 命令学习(持续完善中...)
linux 命令学习(持续完善中...) 主要是记录一些开发过程中用到的linux命令,慢慢补充 一.用户 1.添加用户: useradd 用户名 2.设置密码:passwd 用户名 ,然后按照提示输 ...
- thinkphp 3.2.3 - Think.class.php 解析
class Think { public static function start() { // 注册AUTOLOAD方法 spl_autoload_register('Think\Think::a ...
- Susan Sontag【苏珊·桑塔格】
Sunsan Sontag Sunsan Sontag was one of the most noticeable figures in the world of literature. 苏珊·桑塔 ...
- TI C6000 优化进阶:循环最重要!
软件流水循环 1. C6000流水线(Pipeline) 一个指令的处理过程并不是一步完成,它被分为三个阶段:取指(Fetch).译码(Decode).执行(Excute).将每一个阶段放入独立的流程 ...
- 11,scrapy框架持久化存储
今日总结 基于终端指令的持久化存储 基于管道的持久化存储 今日详情 1.基于终端指令的持久化存储 保证爬虫文件的parse方法中有可迭代类型对象(通常为列表or字典)的返回,该返回值可以通过终端指令的 ...