并发问题!!!
我对sql server 2000的并发控制不是很了解,所以想问一下,在以下代码中:
--*******************************************************************
ALTER PROCEDURE dbo.SetPublishNumber
(
@PublishID uniqueidentifier
)
AS
SET NOCOUNT ON
update Publishes
set [PublishNumber] = dbo.GetNewestPublishNumber(getdate())
where [ID] = @PublishID
RETURN
GO
ALTER FUNCTION dbo.GetNewestPublishNumber
(
@currentDate datetime
)
RETURNS nchar(7)
AS
BEGIN
declare @MaxNumber nchar(7)
select @MaxNumber = Max([PublishNumber])
from dbo.[Publishes]
--@@
--中间部分省略,就是根据年份计算一个最大的编号
RETURN dbo.IntToFixedLengthString(@Year, 4) + dbo.IntToFixedLengthString(@Order, 3)
END
GO
--*************************************************************************
存储过程SetPublishNumber的执行总能成功吗?
sql server中不同连接中的sql命令最终是排队在同一个线程中执行呢?还是每个连接分配一个线程并发执行?
如果是并发执行,假设两个并发的连接A和B同时执行存储过程SetPublishNumber,当A执行到位置--@@时,由于线程切换,运行A的线程被停止;接着运行B的线程开始执行,B能执行select @MaxNumber = Max[PublishNumber])from dbo.[Publishes] 这条语句吗?
谢谢
问题点数:50、回复次数:4Top
1 楼KingSeaMountain()回复于 2006-03-16 15:40:44 得分 0
...Top
2 楼wgsasd311(自强不息)回复于 2006-03-16 15:50:57 得分 25
存储过程SetPublishNumber的执行总能成功吗?
===>
也会能失败
sql server中不同连接中的sql命令最终是排队在同一个线程中执行呢?还是每个连接分配一个线程并发执行?
====>
多线程并发执行
如果是并发执行,假设两个并发的连接A和B同时执行存储过程SetPublishNumber,当A执行到位置--@@时,由于线程切换,运行A的线程被停止;接着运行B的线程开始执行,B能执行select @MaxNumber = Max[PublishNumber])from dbo.[Publishes] 这条语句吗?
====>
当然可以执行Top
3 楼KingSeaMountain()回复于 2006-03-16 18:11:36 得分 0
那用什么语句、锁定什么对象,才能让SetPublishNumber的运行结果一定是正确的?
Top
4 楼efly75()回复于 2006-03-16 18:39:51 得分 25
你目前这种方式,高并发时肯定全有问题。 而且如果publisher表记录比较多(如几百万条),光取一个最大值都会很长时间。
建议:你可以另外加一个表,只有一个字段,记录数只有一条。每次取最大值时,就修改此记录,将其加一(注意,需要在where语句中加上原值的判断)。 这样,由于使用update语句,在你提交事务这前,别人是不能再修改加一的。
不过,这种方式,在并发数很高时(如几百个用户频繁调用),可能会出现堵塞的情况。但至少可以保证不会得到重复的ID。Top




