关于MS SQL的行锁定,邹健、马可、各路高手请帮忙看看!

luckyprg 2005-03-18 10:48:38
我们开发系统时,经常会遇到多用户同时操作相同数据的,我现在需要的功能是:
用户A select出来的资料其他用户在select时不会包含用户A select出来的那些资料,但用户A select出来的那些资料用户A可以操作,而且如果用户A在一定的时间内没有操作就自动解锁(解除行锁定)。
因为是Web系统,所以用户A的select动作和update操作不可在同一个存储过程中,必须分开。

我看过好像行锁定可以实现这样的效果,不过我试过效果都不正确(我用行锁定时其他用户连整个表都不能查询了,我需要的只是要跳过那些行锁定的记录)。

麻烦大家针对以上需求写一段示例程序出来。谢谢!
...全文
110 点赞 收藏 4
写回复
4 条回复
smartcoffee 2005年06月06日
mark
回复 点赞
--锁定记录,只允许单用户修改的例子:

--创建测试环境
--创建测试表--部门表
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(minute,dt,@dt)<5) --锁的超时时间为5分钟
set @re=1
else
set @re=0
return(@re)
end
go

--数据处理测试,操作记录3
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
回复 点赞
luckyprg 2005年03月18日
除了行锁定外我只想到一个办法,就是给数据库加几个字段LockUserID、Locked、LockTime,select的同时更新这些记录的LockUserID、Locked、LockTime,在规定的时限内只有LockUserID可以更新。
所有用户select前先将LockTime和getdate()比较,超过时限的先解锁,再select资料出来。不过我觉得这样做太麻烦。所以想偷懒,想用数据库本般的机制来完成。
不知各位有没有更方便的方法?
回复 点赞
子陌红尘 2005年03月18日
行锁可以吗?在B/S模式的系统中,通过Browser连接到Server,向数据库请求的都是短连接,即便是使用了行锁,在连接关闭之后,锁也随着事务的结束而释放了。

用数据库本身的机制是没有可能的,只能在程序中另想办法。
回复 点赞
发动态
发帖子
应用实例
创建于2007-09-28

1.1w+

社区成员

6.8w+

社区内容

MS-SQL Server 应用实例
社区公告
暂无公告