如何避免死锁 1 使用事务时,尽量缩短事务的逻辑处理过程,及早提交或回滚事务; 2 设置死锁超时参数为合理范围,如:3分钟-10分种;超过时间,自动放弃本次操作,避免进程悬挂; 3 优化程序,检查并避免死锁现象出现; 4 .对所有的脚本和SP都要仔细测试,在正是版本之前。 5 所有的SP都要有错误处理(通过@error) 6 一般不要修改SQL SERVER事务的默认级别。不推荐强行加锁
锁定记录,只允许单用户修改的例子 create table #锁表(编号 int) --代码: if exists(select 1 from 编号='你的编号') return insert #锁表 values('你的编号') .....你处理的代码 delete #锁表 where 编号='你的编号' -------------------------------------- --为了防止死锁,建议加时间: create table #锁表(编号 int,时间 datetime) --代码: if exists(select 1 from 编号='你的编号' and datediff(ss,时间,getdate())<5 --如果锁的时候超过5秒,则是处理超时 ) return delete from #锁表 insert #锁表 values('你的编号',getdate()) .....你处理的代码 delete #锁表 where 编号='你的编号' --------------------------------------- --锁定记录,只允许单用户修改的例子: --创建测试环境 --创建测试表--部门表 create table 部门(departmentid int,name varchar(10)) --记录锁定表 create table lock(departmentid int,dt datetime) go --因为函数中不可以用getdate,所以用个视图,得到当前时间 create view v_getdate as select dt=getdate() go --创建自定义函数,判断记录是否锁定 create function f_chk(@departmentid int) returns bit as begin declare @re bit,@dt datetime select @dt=dt from v_getdate if exists(select 1 from lock where departmentid=@departmentid and datediff(ss,dt,@dt)<5) set @re=1 else set @re=0 return(@re) end go --数据处理测试 if dbo.f_chk(3)=1 print '记录被锁定' else begin begin tran insert into lock values(3,getdate()) update 部门 set name='A' where departmentid=3 delete from lock where departmentid=3 commit tran end --删除测试环境 drop table 部门 drop view v_getdate drop function f_chk
如何避免死锁
最新推荐文章于 2025-05-09 23:30:31 发布