排它锁为什么不起作用

txt_ly 2009-06-19 04:14:23
create proc [dbo].[Sys_GetUserID]
@OutID int=0 output
as
--取用户ID
set nocount on
begin tran
select top 1 @OutID=UserID from dbo.Sys_UserID where IsOk=0
update dbo.Sys_UserID set IsOk=1 where UserID=@OutID
commit tran
上面这个存储过程,是用来取用户ID,单线程时没问题,多线程时取值很多是相同的,我的理解是
update dbo.Sys_UserID set IsOk=1 where UserID=@OutID 这个应是排它锁,在没提交事务这前,其它进程不能访问才对!
现在感觉没起作用!

我试个例子:

新建两个连接
在第一个连接中执行以下语句
begin tran
update table1
set A='aa'
where B='b2'
waitfor delay '00:00:30' --等待30秒
commit tran
在第二个连接中执行以下语句
begin tran
select * from table1
where B='b2'
commit tran

若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒)
但结果不是,第二个连接立马能查出来

那位高手能出来解惑
...全文
47 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
alter proc [dbo].[SysUser_GetUserID]
@OutID int=0 output
as
--取用户ID
set nocount on
begin tran
select top 1 @OutID=UserID from dbo.SysUser_Info with(TABLOCKX) where IsCheck=0

update dbo.SysUser_Info set IsCheck=1,Cretime=dateadd(day,-1,getdate()),LastTime=getdate(),LoginTime=getdate() where UserID=@OutID
commit tran
go
SET TRANSACTION ISOLATION LEVEL Serializable
go
多线程访问时没为什么还不行
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
把它事务隔离级别设到最高,SET TRANSACTION ISOLATION LEVEL Serializable,测试时就一定会锁住数据,但我的程序还是
没有通过
Garnett_KG 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 txt_ly 的回复:]
晕,我用的sql2005,要设置什么吗
我按楼上试了,第一次他老老实实等到5秒,第二,三次他就不老实等了,这是什么原因
[/Quote]

这是2005牛x的地方,第二次执行的时候,它知道跟上一次执行的结果相比并没有更改数据,所以它不会锁住数据。
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
alter proc [dbo].[SysUser_GetUserID]
@OutID int=0 output
as
--取用户ID
set nocount on
begin tran
select top 1 @OutID=UserID from dbo.SysUser_Info with(TABLOCKX) where IsCheck=0

update dbo.SysUser_Info set IsCheck=1,Cretime=dateadd(day,-1,getdate()),LastTime=getdate(),LoginTime=getdate() where UserID=@OutID
commit tran

用with(TABLOCKX)独占表级锁都还有重复的,跟它描写的不符
TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表 是不是我用错了,那们大佬来指点一下,
只用了100个线程调用这个存储过程
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
ID已经存在表里,要把它取出来,同时把它置为已用,
数据ID只能取一次,多线程时,同一个id取了好几次,
我的想法是能不能一个线程取的把它锁住,让其它线程不能访问,
又不能造成死锁,有什么好的方法
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
晕,我用的sql2005,要设置什么吗
我按楼上试了,第一次他老老实实等到5秒,第二,三次他就不老实等了,这是什么原因
ai_li7758521 2009-06-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 txt_ly 的帖子:]
若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒)
但结果不是,第二个连接立马能查出来[/Quote]SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 5011 毫秒。我的他老老实实等到5秒的啊
ai_li7758521 2009-06-19
  • 打赏
  • 举报
回复
SELECT [ID],[F1],[F2],[F3],[F4],[F5]
FROM [dbo].[T2]

ID F1 F2 F3 F4 F5
----------- ---------- ----------- ----------- ----------- -----------
1 A1 38 48 59 0
2 A1 12 2 56 1
3 A1 34 5 59 2

(3 行受影响)



set statistics time on
begin tran
update [dbo].[T2]
set [F1]='v'
where ID=1
waitfor delay '00:00:05' --等待30秒
commit tran
--在第二个连接中执行以下语句
begin tran
select * from [dbo].[T2]
where ID=1
commit tran

SQL Server 分析和编译时间:
CPU 时间 = 1 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

(1 行受影响)

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 5011 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 2 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SQL Server 分析和编译时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
ID F1 F2 F3 F4 F5
----------- ---------- ----------- ----------- ----------- -----------
1 v 38 48 59 0

(1 行受影响)


SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。

SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
select top 1 @OutID=UserID from dbo.Sys_UserID with(tbllock) where IsOk=0 加个(tbllock) 好像死锁了,程序超时
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
3楼:update dbo.Sys_UserID set IsOk=1 where UserID=(select top 1 @OutID=UserID from dbo.Sys_UserID where IsOk=0)
有语法错误 @OutID=UserID
-晴天 2009-06-19
  • 打赏
  • 举报
回复
写在同一句中试试:
update dbo.Sys_UserID set IsOk=1 where UserID=(select top 1 @OutID=UserID from dbo.Sys_UserID where IsOk=0)
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
能不能取到
select top 1 @OutID=UserID from dbo.Sys_UserID where IsOk=0
这一行的排它锁
txt_ly 2009-06-19
  • 打赏
  • 举报
回复
自己先顶一个

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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