数据库死锁的解决办法
一、破坏死锁的四个必要条件
二、如果发生死锁,通过SQL语句关闭当前发生死锁的数据库进程
USE master --不能用 KILL 来取消您自己的进程。
GO
/****** Object: StoredProcedure [dbo].[p_Centaline_Who_Lock] Script Date: 03/23/2016 11:54:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
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 p_killspid '需要关闭进程的数据库名' 当强制关闭进程后,死锁也就没有了
二、查看当前数据库下锁的情况
CREATE Table #Who(
spid int,
ecid int,
[status] nvarchar(50),
loginname nvarchar(50),
hostname nvarchar(50),
blk int,
dbname nvarchar(50),
cmd nvarchar(50)
--request_ID int
);
CREATE Table #Lock(
spid int,
dpid int,
[objid] int,
indld int,
[Type] nvarchar(20),
[Resource] nvarchar(50),
Mode nvarchar(10),
[Status] nvarchar(10)
);
INSERT INTO #Who
EXEC sp_who active --看哪个引起的阻塞,blk
INSERT INTO #Lock
EXEC sp_lock --看锁住了那个资源id,objid
DECLARE @DBName nvarchar(20);
SET @DBName='KF-BJAgencyAtt'
SELECT #Who.* FROM #Who WHERE dbname=@DBName
SELECT #Lock.* FROM #Lock
JOIN #Who
ON #Who.spid=#Lock.spid
AND dbname=@DBName;
--最后发送到SQL Server的语句
DECLARE crsr Cursor FOR
SELECT blk FROM #Who WHERE dbname=@DBName AND blk<>0;
DECLARE @blk int;
open crsr;
FETCH NEXT FROM crsr INTO @blk;
WHILE (@@FETCH_STATUS = 0)
BEGIN
dbcc inputbuffer(@blk);
FETCH NEXT FROM crsr INTO @blk;
END
close crsr;
DEALLOCATE crsr;
--锁定的资源
SELECT #Who.spid,hostname,objid,[type],mode,object_name(objid) as objName FROM #Lock
JOIN #Who
ON #Who.spid=#Lock.spid
AND dbname=@DBName
WHERE objid<>0;
--SELECT * FROM #Lock
DROP Table #Who;
DROP Table #Lock;
查看死锁实例
BEGIN tran
UPDATE B SET age=age+1
WaitFor Delay '00:00:05';
SELECT * FROM A --执行完之后有结果
在新建一个查询,执行下面sql语句
BEGIN tran
UPDATE a SET dd=dd+1
WaitFor Delay '00:00:05';
SELECT * FROM B
ROLLBACK tran --当执行的时候会一直执行下去
查看出现死锁语句
转载于:https://www.cnblogs.com/starts/p/5311936.html
数据库死锁的解决办法相关推荐
- 数据库死锁及解决办法
文章目录 1. 事务之间对资源访问顺序的交替 2. 并发修改同一记录 3. 索引不当导致的死锁 目前,我们已经探讨了许多关于数据库锁的问题,锁能够有效地解决并发的问题,但这也带来了一个严重的缺点,那就 ...
- 数据库死锁及解决方法
数据库死锁及解决方法 参考文章: (1)数据库死锁及解决方法 (2)https://www.cnblogs.com/wezheng/p/8366029.html 备忘一下.
- restore还原不同名称的数据库_Sql Server 备份还原失败错误ERROR:3145(备份集中的数据库备份与现有的数据库不同)及解决办法...
一.前言 SQL Server 备份和还原全攻略,里面包括了通过SSMS操作还原各种备份文件的图形指导,SQL Server 数据库最小宕机迁移方案,里面使用SQL脚本(T-SQL)完成完全备份.差异 ...
- ORA-01109:数据库未打开 解决办法
ORA-01109:数据库未打开 解决办法 直接上办法 先来张操作截图 具体操作步骤 问题解读 直接上办法 先来张操作截图 具体操作步骤 1.打开sqlplus.exe 2.请输入用户名: 用户名 a ...
- DreamMail无法打开邮件数据库问题的解决办法
DreamMail无法打开邮件数据库问题的解决办法 (http://blog.csdn.net/kingspider/) DreamMail(http://www.dreammail.org/)是一个 ...
- mysql远程无法登陆_无法远程登陆MySQL数据库几种解决办法
无法远程登入MySQL数据库的解决办法一: 尝试用MySQL Adminstrator GUI Tool登入MySQL Server,Server却回复错误讯息:Host '60-248-32-13. ...
- win10远程桌面连接报错(出现身份验证错误。要求的函数不受支持。CredSSP 加密数据库修正)解决办法
某天使用win10系统进行远程桌面连接时,出现了连接失败的情况,提示: 出现身份验证错误. 要求的函数不受支持 这可能是由于 CredSSP 加密数据库修正. 多次重试,问题依旧,而以往是可以正常进行 ...
- 连接阿里云服务器上MySQL数据库失败的解决办法
一 数据库配置,MySQL默认是不能远程连接 只需要在/etc/mysql下的my.cnf文件里注释掉bind-address = 127.0.0.1 就可以了,如图: 二 安全组设置 阿里云服务器默 ...
- SqlServer数据库置疑的解决办法
导读: /*--重置置疑状态 1.系统方法: 如果 sql server 因为磁盘驱动器不再有可用空间,而不能完成数据库的恢复, 那么 microsoft® sql server™ 2000 会返回错 ...
最新文章
- Mysql技术内幕——InnoDB存储引擎
- c语言读h5文件,我利用C语言实现SHA-256算法,需要从一个txt文件中读出数据并把...
- 使用 Cordova 打包 app
- C/C++运行时库 解释
- 面对人性,有的选择向左,有的向右
- java中有stdin_在java中听stdin的后台进程
- 安装JAVA8要登录_JDK8的安装及环境配置
- 转:探索 AIX 6:在 AIX 6 上配置 iSCSI Target
- mongodb数据库导出备份
- 使用 HTML5 canvas 进行 Web 绘图
- Python+tkinter动态创建与销毁组件小案例
- Java harddisk pc cpu,java获得cpu使用率
- 卡巴斯基2014激活码授权文件KEY
- 使用鸿蒙原生做游戏适配问题
- 解决多次点击出现蓝色背景
- 怎么安装光盘并重新启动计算机,如何用光盘重新安装电脑系统
- VS在新建或者导入项目时出现“不支持此接口(Exception from HRESULT:0x80004002 (E_NONINTERFACE))”的解决办法
- Second season sixth episode,Chandler and Joey lost Ross‘s baby???!!!
- php mysql插入的数据有引号,PHP引号转义中解决POST,GET,Mysql数据自动转义问题
- 面试官刁难:Java字符串可以引用传递吗?