锁定一个表

todouwang 2006-01-17 05:45:30
我遇到的问题是这样:在sql server中我使用存储过程根据一个表中count(*)的数量来做相应的操作.
但我发现如果几个用户同时调用这个存储过程,得到的count(*)是相同的,也就是本来应该一个用户满足条件,现在却是同一时间并发的用户都满足条件了.

我希望在这个存储过程中,将这个表锁定,不允许其他用户同时访问.却不知道该如何操作.


请指教,多谢!
...全文
282 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zuojianyou 2006-05-23
  • 打赏
  • 举报
回复
mark
huisz 2006-04-30
  • 打赏
  • 举报
回复
mark~!
做鸡真好吃 2006-04-12
  • 打赏
  • 举报
回复
Mark~
todouwang 2006-01-17
  • 打赏
  • 举报
回复
采用了with (tablockx)
多谢各位!
子陌红尘 2006-01-17
  • 打赏
  • 举报
回复
事务&表锁
-------------------------------------------------------------
--开始失误
begin tran

--锁表
select * from 表 with(tablock)

--定义变量并将表中记录数保存至变量
declare @count int
set @count=@@rowcount

--利用变量进行相关处理
...

--提交事务
commit tran
zlp321002 2006-01-17
  • 打赏
  • 举报
回复
--这个对应你的存储过程,稍微修改下,即可!
-狙击手- 2006-01-17
  • 打赏
  • 举报
回复
1 如何锁一个表的某一行


A 连接中执行

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

begin tran

select * from tablename with (rowlock) where id=3

waitfor delay '00:00:05'

commit tran

B连接中如果执行

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)
其他事务不能读取表,更新和删除
zlp321002 2006-01-17
  • 打赏
  • 举报
回复
--用事务加锁
例子:

--第一个窗口执行
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
begin tran
select count(*) from Test with (TABLOCKX)
--对Test表进行操作,插入、删除
waitfor delay '00:00:20'
commit tran

--第二个窗口统计
--由于窗口一,进行了插入、删除操作,所以统计数量变化了!并且要等待20S,把窗口一的事务处理完成后,才能执行统计.所以个数可以不相等了!
select count(*) from Test




34,590

社区成员

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

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