多线程可以同时Insert到同一个数据库吗?(50分)

  • 主题发起人 主题发起人 yecloudy
  • 开始时间 开始时间
Y

yecloudy

Unregistered / Unconfirmed
GUEST, unregistred user!
有没有冲突呢?
 
insert操作会引起SQL表上锁,等到这个记录操作完后再允许别的操作别的记录。我记得SQL7好像是表级锁
SQL2K好象是可以达到行级锁了。
 
你的意思是可能存在多个线程同时将数据写入同一个库中吧?
你可以通过帐号来登进库中,对不同的表或其它的进行操作,不会存在问题,但如果同时对
一个表进行操作,要有问题了,出现了竞争了哦!
 
可以用一个线程专门来负责insert呀。
 
可以利用CtiticalSection来对insert进行保护,一次只能有一个线程,这个线程完成了,别的线程才能做同样的事
 
同意 枫
一般数据库都是线程安全的
 
好像SQL server能处理多线程的
 
Assignfile(F,FileName);
Reset(F);
while not Eof(f)do
begin
Readln(F,FileItem);
AnalyzeDir(FileItem);
with ADOCommanddo
begin
CommandText:='insert into allml(name,time,ip)'
+'values (:name,:time,:ip)';
Parameters.ParamByName('name').Value :=name;
Parameters.ParamByName('time').Value :=time;
Parameters.ParamByName('ip').Value :=ip;
execute//每增加一条记录,都execute一次,请问有没有批处理的方法,我用的是ADO控件。
end;
end;
end
我刚刚试了用多线程直接添加到数据库,有数据丢失,
所以在execute后,我加了sleep(50);
就可以,不过效率应该降了很多。
 
请问可不可以这样子:
利用ADO的BatchUpdate.
各个线程先insert到本机的缓存,
再各自update.
好不好呢?
 
to:yecloudy
刚才写的一大段丢失。简单言之:
使用ADO的BatchUpdate。ADO会自己产生Insert SQL ,道理一样。
使用BDE的batchmove速度惊人,不知是何原理?


 
没问题,数据库如果不支持多线程安全那么程序员就必须编写各机器之间同步的代码……这样的数据库产品定位在桌面数据库还勉强凑和。
 
同意coolingxyz:
你的多线程可以往一个缓冲区写入需要保存的数据,然后由一个专门的模块真正的处理insert操作啊。
 
默认是表锁定,,,如果你真正要用多线程操作数据库,也是可以的,,,但你必须对可能
出现资源 Risk 的地方使用同步机制来同步你的线程,,这样你的线程就不会冲突了发生
死锁了;你也可以用一个线程来完成对数据库的操作,而其它就不管写入数据库的事,只管
收集数据之类的事;
,至于同步的方法,可以用互斥,临界区,信号灯,,,论坛上有好多了,,,我
在论坛上发过比较详细的使用方法的帖子的,,你去搜搜吧 : )
 
可以的。不过最好是在SERVER上从储过程。在过程中INSERT 数据
 
越看越象 Midas 的 ClientDataset的处理方式
 
后退
顶部