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 ...
随机推荐
- python_33_文件操作2
f=open('yesterday',encoding='utf-8') #print(f.readline())#读一行,并且是第一行 #读前5行 for i in range(5):#range( ...
- 关于请求时状态为cancel
项目中发现有一个问题,在我发送某些请求的时候请求一会状态就变为cancel了,我滴个乖乖,这是咋回事,被取消了,后来经过仔细排查后发现了以下两个问题 1.AJAX和form表单同时使用,(form提交 ...
- AngularJS 对象
AngularJS对象就像JavaScript对象 <!DOCTYPE html><html><head><meta http-equiv="Con ...
- Symmetric Difference-freecodecamp算法题目
Symmetric Difference 1.要求 创建一个函数,接受两个或多个数组,返回所给数组的对等差分(symmetric difference) 例子:给出两个集合 (如集合 A = {1, ...
- SPOJ2713GSS4 - Can you answer these queries IV(线段树)
题意 Sol 讲过无数次了..很显然,一个$10^12$的数开方不超过$8$次后就会变为$1$ 因此直接暴力更改即可,维护一下这段区间是否被全改为了$1$ 双倍经验:https://www.luogu ...
- linux 下备份mysql数据库
今天老板让备份数据库没办法自己折腾吧,下面把折腾的结果总结总结. 数据库备份思路: 1.编写脚本 2.执行脚本 哈哈,是不是很简单,打开冰箱,放入大象,关上.下面我是具体操作. 一.编写脚本 1.设 ...
- Python数据类型的用法
字符串的用法 res = 'hellow,world' print(res) #res.显示的都是它的方法,下划线的除外 1 判断字符串的结尾字符,返回的值的布尔形式 endswith 判断字符串的开 ...
- has value '1.8', but '1.7' is required
使用java7,自己又想在空闲时间学一些java8的新特性,故在安装完1.7之后又安装了1.8 eclispe在启动时报’has value ‘1.8’,but’1.7’ is required’的错 ...
- Codeforces Round #464 (Div. 2) B. Hamster Farm
B. Hamster Farm time limit per test2 seconds memory limit per test256 megabytes Problem Description ...
- UVA:11297-Census(二维线段树)
Census Time Limit: 8 sec Description This year, there have been many problems with population calcul ...