我要多线程从数据库中取一条记录,并且取完后更新记录状态,怎样让多线程不会取到同一条记录,这些线程可能在不同的进程中.我希望通过事务来控制,但好像不行,存储过程如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
goALTER PROCEDURE [dbo].[up_GetEmailReceiver]
AS
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN
BEGIN TRANSACTION T1
BEGIN TRY
declare @recieveId varchar(200)
set @recieveid = ''
select top 1 @recieveId = RecieveId from RecieveList with(updlock) where  Status = 0 order by SendLevel desc
if(@recieveId <> '')
begin
update RecieveList set Status = 1,SendTime = GetDate() where RecieveId= @recieveId and Status = 0
IF @@error<>0 or @@rowcount = 0
BEGIN
ROLLBACK TRANSACTION T1
-- SET ROWCOUNT 0
RETURN 0
END
select * from RecieveList where RecieveId = @recieveId
end COMMIT TRANSACTION T1
-- SET ROWCOUNT 0
RETURN 1

END TRY
BEGIN CATCH
ROLLBACK TRANSACTION T1
-- SET ROWCOUNT 0
RETURN 0
END CATCH

END

解决方案 »

  1.   

    看我的存储过程,我会更改状态的,线程不停的去拿状态为0的记录,拿到后将状态更改为1,然后进行处理,处理完毕后,会将这条记录移到另外一张表里,单两个或多个线程不能同时读到一条记录,否则就会有多个线程做同一件事情了,又因为我可能会开多个进程去做,所以不能在代码里用lock来控制同步,所以我希望能用存储过程加事务来实现同步,不知道是否可以
      

  2.   

    在存储过程中使用lock锁定啊,就不会出现那种问题了