有关C/S有100个客户端同时进行同一个INSERT操作的时候.....急啊!!(100分)

W

winmax

Unregistered / Unconfirmed
GUEST, unregistred user!
各位有经验的大侠:
现在我有一个网络版的多用户系统(C/S结构,delphi+sqlserver2000,网络是通过VPN来连接的,大概有100个左右的客户端)遇到下面问题:
先看delphi程序原形:
adoconnection1.begintrans;
with adoquery1 do
begin
close;
sql.clear;
sql.add('insert into table1 values:)a1,:a2....)');
parameters[0].values:=..;
parameters[1].values:=..;
.
.
execsql;
adoconnection1.committrans;
end;
当有多个客户端同时进行以上操作时(这里是指同一时间),就会出现有很多个客户端出现要待很久很久的情况,怎样解决这一难题呢,因为每个客户端都在不同的地方,所以很容易出现以上情况.要知道,如果一个客户端通过VPN要5秒才能完成从begintrans到committrans的事务的话,那现在如果100个客户端同时进行这个操作,那最后那个客户端不是要等待100*5=500秒的时间吗??
有谁有过这方面的经验呢??可以不吝惜告诉我吗??很急啊.........
 
不会吧。还有这事。100人还能用CS

要是不好好想想办法会有问题的。。
 
更改表的锁定级别?
 
大哥们,可以给个完整的解决方案给我吗???
很急啊~~~~~~~~~~~~~
 
你就只有一步操作,应该可以不用事务吧。
事务里至少有两步操作。
 
用存储过程吧,100个并发调用,应该是很快了,也不会有冲突
 
数据库管理本身就有该功能呀!
要不,你人为判断或提示!
 
强烈建议将事务处理放在存储过程中,这样能大大缩短事务处理的时间。
 
用存储过程,在存储过程中可以用事务处理,不要在程序是显示的调用事务。
 
TO xmh_31:
有存储过程,具体要在服务器跟客户端做些什么呢??
 
100人能用CS,我400人都可以,C/S速度>>三层
记得用try except
不成功rollback.
 
5*100=500? SQL server 2000不是你想的那样支持多用户的。
微软显然比你要聪明。
 
最好改成三层,再用存取过程+多线程了!,,注意排错。。否则到时有你搞的
 
三层速度实在不敢恭维。
 
插入数据的时候是不会造成锁表的,
所以,如果你的是多线程的,应该不会出现这种情况的

但是大量插入数据时速度的确是比较慢的
每秒钟插入200条记录已经很不错了
如果你的是拨号连接(数据传输速率低),那么副作用可就大了
 
是啊,我现在这套系统就是用VPN拨号上网连接服务器的啊,怎么办?有什么其它更好的办法解决我提的问题呢???
请各位大侠帮忙!
 
改成三层,并使用快速数据导入来插入记录,
效果比较好一点

快速数据导入的插入速度可以达到1000条每秒以上
 
不行啊,只能C/S了,因为系统已经在使用了!!不能再改!这个也是客户的意思!
 
拨号上网连接服务器更不能在客户端操作事务呀,否则不慢死才怪[:D]
 
但如果在数据库里写一个存储过程的话,当第一个用户要插入记录运行调用这个存储过程时,其他用户也同时要插入记录运行调用这个存储过程啊,它们之间不会有影响吗??会不会存在有其它的问题呢?
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
顶部