读书人

多线程操作数据库有关问题!

发布时间: 2012-03-08 13:30:13 作者: rapoo

多线程操作数据库问题!!请教高手!
我要多线程从数据库中取一条记录,并且取完后更新记录状态,怎样让多线程不会取到同一条记录,这些线程可能在不同的进程中.我希望通过事务来控制,但好像不行,存储过程如下:
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锁定啊,就不会出现那种问题了
[解决办法]
如果不在存储过程中使用锁定,有可能在没有改变状态之前多个线程取到同一条记率

读书人网 >C#

热点推荐