锁定几条数据,让别人不能操作
有几个同时运行的程序可能会同时从数据库表中读取数据,并做适当处理,但不希望他们读取相同的数据而做重复无用的处理。
为实现上述要求,我做了以下操作,但有问题,请大家帮忙看一下:
表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