我在编一个vb2005+sql2000的c/s 工资系统,
我想实现的功能是分场的一个办事员将自己分场的数据利用dataset中的数据update到服务器数据库的工资库总表时,判断一下是否有别的分场的办事员,也在同时进行相同的update操作,如果有,为避免出现错误,等待别人的update操作完成,在进行自己的update操作.
请高手指点,我该如何实现.
我想实现的功能是分场的一个办事员将自己分场的数据利用dataset中的数据update到服务器数据库的工资库总表时,判断一下是否有别的分场的办事员,也在同时进行相同的update操作,如果有,为避免出现错误,等待别人的update操作完成,在进行自己的update操作.
请高手指点,我该如何实现.
/*
测试环境:windows 2K server + Mssql 2000
所有功能都进行测试过,并有相应的结果集,如果有什么疑义在论坛跟帖
关于版权的说明:部分资料来自互联网,如有不当请联系版主,版主会在第一时间处理。
功能:sql遍历文件夹下的文本文件名,当然你修改部分代码后可以完成各种文件的列表。
*/
A 连接中执行SET TRANSACTION ISOLATION LEVEL REPEATABLE READbegin transelect * from tablename with (rowlock) where id=3waitfor delay '00:00:05'commit tranB连接中如果执行update tablename set colname='10' where id=3 --则要等待5秒update tablename set colname='10' where id<>3 --可立即执行2 锁定数据库的一个表SELECT * FROM table WITH (HOLDLOCK)
注意: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK)
其他事务可以读取表,但不能更新删除SELECT * FROM table WITH (TABLOCKX)
其他事务不能读取表,更新和删除
if exists(select 1 from 编号='你的编号')
returninsert #锁表 values('你的编号').....你处理的代码delete #锁表 where 编号='你的编号'
--------------------------------------
--为了防止死锁,建议加时间:create table #锁表(编号 int,时间 datetime)--代码:
if exists(select 1 from 编号='你的编号' and datediff(ss,时间,getdate())<5 --如果锁的时候超过5秒,则是处理超时
)
returndelete 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
update 同一条记录,sql server默认情况下,自己就会等待上一个独占锁释放,不用你操心。