首先创建一个表
create table ceshisisuo(a varchar(10),b varchar(10),c varchar(10),d varchar(10))
然后随便创建一个存储过程
Create PROC [dbo].[ceshisisuo](@a varchar(10),@b varchar(10),@c varchar(10),@d varchar(10))
As
declare @errmsg varchar(200)
begin try
set @errmsg = '插入表格失败'
begin tran
insert into ceshisisuo(a,b,c,d) values (@a,@b,@c,@d)
select result = '插入表格成功'
end try
begin catch
select result = @errmsg
end catch
在上述过程中,明显的一开始有begin tran 开始事务。在结束的时候没有commit tran 提交事务,和try异常的时候 Rollback Transaction 回滚事务
只要执行了 exec ceshisisuo('1','2','3','4') 就会造成死锁。
select object_name(resource_associated_entity_id) as tableName, request_session_id as pid from sys.dm_tran_locks
where resource_type = 'OBJECT'
就可以看到死锁的表格。 接着kill 掉。表格就会解除死锁。
但是存储过程中,需要改进的是。要添加提交事务和回滚事务。
在insert into后面添加 IF @@TRANCOUNT > 0 Commit Transaction 提交事务
在try的 begin catch后面添加 IF @@TRANCOUNT > 0 Rollback Transaction 回滚事务。在执行存储过程,就不会造成死锁。
这就是最简单的死锁和解除死锁。