多线程操作数据库问题!!请教高手!
我要多线程从数据库中取一条记录,并且取完后更新记录状态,怎样让多线程不会取到同一条记录,这些线程可能在不同的进程中.我希望通过事务来控制,但好像不行,存储过程如下:
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go
ALTER 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
------解决方案--------------------怎样让多线程不会取到同一条记录
----------------------------------
你意思是多个线程同时访问一条记录吧
线程同步就可避免此问题!
------解决方案--------------------多线程同步问题...只允许一个线程去读,更新记录后通知另一线程如此
------解决方案--------------------那你是想实现同时读的时候不重复读,还是一直不重复读?
要是一直不重复读一条这样用多线程也不行啊
------解决方案--------------------意思是不是每个“用户”处理的内容是不相同的,如果有“用户”在处理的内容,别的“用户”不可见
如果是这样的话,你个给每个用户正在操作的内容都赋一个正在操作的标志(比如用户名或线程id什么的),查询的时候判断标志就可以了。但是注意操作完成以后要把标志赋回来
------解决方案--------------------正巧跟你碰上同一问题了
------解决方案--------------------在存储过程中使用lock锁定啊,就不会出现那种问题了
------解决方案--------------------如果不在存储过程中使用锁定,有可能在没有改变状态之前多个线程取到同一条记率