一个序号表中有100000个不同的id
有10个同样的程序(exe)同时运行,每个程序每次取10个序号,取了之后就更新数据库做flag标记,表明已取了,怎样保证每个程序每次取的号都是不相同的
我的想法:
1。读了就锁 那能更新吗
2。若读了之后就解锁,那在更新之前另一个程序又读了此程序刚获取的号,则乱了还有更好且有实践经验的方法吗?
有10个同样的程序(exe)同时运行,每个程序每次取10个序号,取了之后就更新数据库做flag标记,表明已取了,怎样保证每个程序每次取的号都是不相同的
我的想法:
1。读了就锁 那能更新吗
2。若读了之后就解锁,那在更新之前另一个程序又读了此程序刚获取的号,则乱了还有更好且有实践经验的方法吗?
//2.查询后要进行ID的更新,这时对于整个表已经加上UPDLOCK(这个锁应该是等到事务完毕后才自动释放),所以当一个程序在更新完毕数据后,没有提交事务,其它的事务只能处于阻塞状态。也就是更新操作的串行化。但可以放心,这时10个程序同时取的ID肯定是不一样的。//1.模拟生成一些数据
USE tempdb
GO
CREATE TABLE dbo.tb(
id int identity(1, 1),
name nvarchar(128),
Flag INT)INSERT tb(name)SELECT TOP 10000 a.name
FROM syscolumns a full join syscolumns b
on a.name=b.name
GO
2.--测试<一个应用程序可以代表一个事务,一个事务在查询分析器上代表一个查询窗口> BEGIN TRANUPDATE tb
SET FLAG=1
WHERE ID IN (
SELECT TOP 10 ID FROM tb WITH(READPAST)
)commit TRAN
你的分析是比较靠谱的,不过,关键是第一条时READPAST锁会不会真的能起来预期作用,能不能给我多讲一下READPAST锁的作用,谢谢
select Top 10 ID from tb with(xlock,paglock) where Flag=0
Update tb set Flag=1 where ID in(select Top 10 ID from tb where Flag=0)
Commit Trans
你说得对,
但with(xlock,paglock)和WITH(READPAST)
什么区别,实际用时哪个更可靠?