存储过程中实现行级排他锁问题

love_cutezhou 2007-12-06 04:46:52
对一个表的第一列加上排他锁,在一个事务中假如没有完成该事务,其他用户不能对此行数据进行操作,怎么实现?
select a from aaa with (rowlock) where b = 1 还是
select a from aaa with (rowlock,xlock) where b = 1

高手点明 谢谢


...全文
147 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
love_cutezhou 2007-12-19
  • 打赏
  • 举报
回复
一个事物里面写的,搜索和更新,要得是搜索出来的数据用,然后更新该数据
leihentulong 2007-12-17
  • 打赏
  • 举报
回复
我感觉你处理的方法有问题;
严格控制锁倒不如提高你的读取数据的顺序控制.更新控制;
以最先提交的值为正确.其他的提示数据修改.
love_cutezhou 2007-12-17
  • 打赏
  • 举报
回复
楼上,这样只能在这行数据锁住的情况下检索出来,我要的效果是在检索出这条数据后,要取得当前值,然后对这个字段进行更新。
而在此过程中避免别的用户对此数据进行查询更新之类的操作/
arrow_gx 2007-12-14
  • 打赏
  • 举报
回复
看联机帮助:
你的应用需求就用:
select a from aaa with (nolock) where b=1

就可以了
fwacky 2007-12-14
  • 打赏
  • 举报
回复
xuexi
love_cutezhou 2007-12-14
  • 打赏
  • 举报
回复
期待最终答案
DengXingJie 2007-12-13
  • 打赏
  • 举报
回复
鎖一直是個頭痛的問題
進來學學
love_cutezhou 2007-12-13
  • 打赏
  • 举报
回复
2楼的 高手

直接加xlock,那么对没有指定的别的行,是不是也加有了xlock锁呢?
fa_ge 2007-12-06
  • 打赏
  • 举报
回复
--联机帮助上

XLOCK

使用排它锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用 PAGLOCK 或 TABLOCK 指定该锁,这种情况下排它锁适用于适当级别的粒度。
fa_ge 2007-12-06
  • 打赏
  • 举报
回复
对一个表的第一列加上排他锁,在一个事务中假如没有完成该事务,其他用户不能对此行数据进行操作,怎么实现?

------------
select a from aaa with (xlock) where b = 1
-狙击手- 2007-12-06
  • 打赏
  • 举报
回复
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

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧