sql rowlock WITH (tablockx)

asq985 2011-04-11 12:39:03
如果data表里有N条数据

存储过程:

declare @tmpId bigint
BEGIN TRANSACTION

SELECT top 1 @tmpId=Id FROM data rowlock WITH (tablockx) WHERE dstatus=0
update data set dstatus=1 where Id=@tmpId
select * from data where Id=@tmpId

COMMIT TRANSACTION



如果就使用 rowlock with(tablockx) 是否会出现脏读,重复读?(多个进程同时调用这个存储过程)

谢谢!(只有23分了,哭~~~~~~)
...全文
412 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gw6328 2011-04-11
  • 打赏
  • 举报
回复
不会出现脏读吧。
kingtiy 2011-04-11
  • 打赏
  • 举报
回复
sqlserver默认的是已提交读。你那个select加表锁没用的。执行完后表锁就释放了。
直接UPDATE就是了。判断下@@ROWCOUNT
asq985 2011-04-11
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fredrickhu 的回复:]
你UPDATE的时候会有独占锁的 不必要担心
[/Quote]

SELECT top 1 @tmpId=Id FROM data rowlock WITH (tablockx) WHERE dstatus=0
去掉
SELECT top 1 @tmpId=Id FROM data WHERE dstatus=0
11个客户端去读共计1300个数据,有30几条读重复了,有几条甚至读了3次
--小F-- 2011-04-11
  • 打赏
  • 举报
回复
你UPDATE的时候会有独占锁的 不必要担心
asq985 2011-04-11
  • 打赏
  • 举报
回复
如果数据库有10000行数据,有两个客户端在读取数据(不允许重复读取),如果不加锁,直接update,读取重复率很高的。。。

22,209

社区成员

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

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