如何避免死锁
2012-01-31 09:34
531 查看
如何避免死锁 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
相关文章推荐
- 死锁产生的四个必要条件及如何避免死锁
- 什么是死锁?如何避免死锁? 以及实现线程死锁才程序
- 什么是死锁,产生的原因,如何避免死锁
- 如何避免出现死锁
- 如何在应用程序中避免死锁问题?
- 死锁发生的条件,如何避免死锁
- 死锁的产生以及如何避免死锁
- 死锁产生的原因及条件、如何避免死锁
- 死锁产生的必要条件,如何有效地避免死锁
- 在Java中如何避免死锁?
- 多线程之:如何避免死锁
- 如何避免死锁
- 哲学家吃饭问题 代码实现如何 避免线程死锁
- 什么是死锁?如何避免死锁?
- 如何避免应用程序中的死锁
- 如何避免Java线程死锁
- 如何避免死锁
- 数据库以及线程发生死锁的原理及必要条件,如何避免死锁
- 如何避免死锁
- java如何避免死锁