日期:2014-05-18  浏览次数:20437 次

锁定几条数据,让别人不能操作
有几个同时运行的程序可能会同时从数据库表中读取数据,并做适当处理,但不希望他们读取相同的数据而做重复无用的处理。
为实现上述要求,我做了以下操作,但有问题,请大家帮忙看一下:
表lines(
    line   char(6),
    days   int,
    locked   bit,
    lastupdatetime   datetime
)
设每次读取10条数据:
begin   tran          
declare   @t   table(line   char(6),days   int)          
insert   @t   select   top   10   line,days   from   lines   with   (tablockx)   where   locked=0   order   by   lastupdatetime  
update   lines   set   locked=1   where   line   in   (select   line   from   @t)          
commit   tran          
select   *   from   @t

在查询分析器里执行没有问题,但在VB中用recordset.Open   sql,   Connection,   1后,判断recordset.eof   报错:对象关闭时不允许操作。
将上述sql语句换为select   *   from   lines   就没有问题。
请大家帮忙看看,这里的sql语句该怎样写,才能满足要求。

------解决方案--------------------
用临时表试一下呢
begin tran
--declare @t table(line char(6),days int)
create table #t(line char(6),days int)
--insert @t
insert into #t(line,days)
select top 10 line,days from lines with (tablockx) where locked=0 order by lastupdatetime
update lines set locked=1 where line in (select line from #t)
commit tran
select * from #t
drop table #t
------解决方案--------------------
也来狂顶
------解决方案--------------------
把它写成存储过程试一下
------解决方案--------------------
定義SQL預設值如下:
procedure TRepairCode_Frm.FlatSpeedButton3Click(Sender: TObject);
begin
if MessageDlg( 'Are you Delete datas? ',mtWarning,[mbYes,mbNo],0)=mrno then
begin
Abort
end
else
begin
if DM.ds_Repair.DataSet.FieldByName( 'RepairID ').AsString <> '1 ' then
begin
DM.ds_Repair.DataSet.FieldByName( 'RepairID ').AsString;
DM.ds_Repair.DataSet.Delete;
MessageDlg( 'This datas Delete for Success! ',mtInformation,[mbOK],0);
end else
begin
MessageDlg( 'You can not delete this data! ',mtInformation,[mbOK],0);
Exit;
end;
end;
end;
你測試一下,我這里通過!!
注意:RepairID自動增加,且不能重復!!!
如果數據多了就不行了,這次我寫的ShopFloor管理系統有的數據也不讓別人不能操作的!!!
http://community.csdn.net/Expert/TopicView3.asp?id=5406790