日期:2014-05-19  浏览次数:20787 次

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