您的位置:程序门 -> delphi -> 网络通信/分布式开发



基于sql server 的midas问题


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


基于sql server 的midas问题[已结贴,结贴人:qwertyasd]
发表于:2007-11-06 09:44:13 楼主
会有50-200个客户端同时操作数据库,其中会有20-50个用户同时操作一个表。  
表里的每一条数据都要修改,关键是如何动态的分配给这20-50的客户,避免2个客户同时操作同一条记录。  
20-50个客户会请求服务器端分配一条记录来修改,修改完后提交,然后再请求下一条,直到把这个表的记录都修改完毕。  
发表于:2007-11-06 10:01:161楼 得分:40
用存储过程,其中用事务处理即可.
发表于:2007-11-06 10:16:132楼 得分:0
系统是这样的,3-20个表,每个表有2万-5万条记录,每个表有3-50个用户同时操作,但整个库一般不会超过200个用户。
每条的纪录10几个字段,标记着一个图片的存储路径。
客户端请求服务器端,服务器端根据用户,来确定在那个表里查询,找出这个表里没有修改过的第一条记录,然后服务器返回这个记录的id,和图片给客户端
图片400k左右。客户端修改完毕后提交修改后的纪录。图片不提交,图片只是让客户端看到,客户端根据图片的内容修改纪录。
不知用midas能否应付这样的工作量?
发表于:2007-11-06 10:23:063楼 得分:40
发表于:2007-11-06 10:28:554楼 得分:0
客户端一般十几秒,甚至1分钟才请求一次。
我现在是通过调用服务器端过程来实现,服务器过程,先查询出第一条需要修改的纪录,然后做标记(修改一个字段),以便别的客户请求时不要再返回这条记录。然后把图片和记录id回返客户端。
客户端根据图片填写内容,然后根据返回的id,直接通过sql语句更新数据库。
现在我用10几个客户端来测试,同时提示   记录在更新后可能会改变。
估计是服务器端在查到纪录后正在标记的同时,其他的客户端也请求了这条记录。
我知道我这方法肯定不行,但是希望有经验的高手,能提供更好的解决方案。
发表于:2007-11-06 11:11:055楼 得分:40
锁,时间戳

create   table   a

    id   int,
    name   char(10),
    lastupdate   datetime
)

insert   into   a   values(1,'abc',getdate())


--更新
begin   tran
declare   @olddate   datetime
select   @olddate=lastupdate   from   a   where   id=1
update   name='def',lastupdate=getdate()   where   id=1   and   lastupdate=@olddate
if   @@rowcount=1
    commit
else
    rollback

发表于:2007-11-06 11:21:296楼 得分:40
估计是服务器端在查到纪录后正在标记的同时,其他的客户端也请求了这条记录。  
----------------------------------------------------

這個問題是可以解決的,可以確保不會被同時更新.
update   tablename   set   imgdir='新路徑',標志=已操作   where   id=id     and   imgdir='舊路徑'
如你所述,每次更新都是更新圖片的存儲路徑.
假設兩個客戶端同時取服務器數據,而且很不巧剛好取的是同一條記錄(假設id為5,imgdir為c:\a.jpg),客戶端a要將這條記錄的路徑更新為d:\a.jpg,客戶端b要更新為e:\a.jpg.由於數據庫的鎖機制可以確保同時衹有一個連接來更新同一記錄,因此必然有一個客戶端先成功更新,再執行第二個更新,仔細看上的sql語句會發現,第二個更新是不會成功的,因為where語句中imgdir已經改變了,不滿足條件了.
发表于:2007-11-08 17:23:197楼 得分:0
這個問題是可以解決的,可以確保不會被同時更新.  
update       tablename       set       imgdir=   '新路徑   ',標志=已操作       where       id=id           and       imgdir=   '舊路徑   '  
如你所述,每次更新都是更新圖片的存儲路徑.  
假設兩個客戶端同時取服務器數據,而且很不巧剛好取的是同一條記錄(假設id為5,imgdir為c:\a.jpg),客戶端a要將這條記錄的路徑更新為d:\a.jpg,客戶端b要更新為e:\a.jpg.由於數據庫的鎖機制可以確保同時衹有一個連接來更新同一記錄,因此必然有一個客戶端先成功更新,再執行第二個更新,仔細看上的sql語句會發現,第二個更新是不會成功的,因為where語句中imgdir已經改變了,不滿足條件了.
------------------
我知道数据库只会更新一个,现在我要避免2个客户同时请求一个记录,因为客户的查询条件是一样的,所以同时操作一条记录的情况很多。
发表于:2007-11-08 17:32:228楼 得分:0
一个有2万条记录的表,会有几个客户端同时操作,客户端不停的修改纪录,记录修改完后就不再修改了。
客户端查询纪录的条件是一样的,谁先申请,服务器就把没修改的记录分配给谁。现在要做的是如何避免服务器会把同一条记录分配给2个客户。
发表于:2007-11-10 15:30:489楼 得分:0
锁,时间戳  

create       table       a  
(  
        id       int,  
        name       char(10),  
        lastupdate       datetime  
)  

insert       into       a       values(1,   'abc   ',getdate())  


--更新  
begin       tran  
declare       @olddate       datetime  
select       @olddate=lastupdate       from       a       where       id=1  
update       name=   'def   ',lastupdate=getdate()       where       id=1       and       lastupdate=@olddate  
if       @@rowcount=1  
        commit  
else  
        rollback  


//////////////
事务   锁   我是过了,锁只能对更新的操作起作用,我现在想要的是,查询的就是要避免读取同一条记录。
因为查询的条件相同   所以客户读取同一条记录的机会很大。我可不想让用改完记录告诉用户不可提交。
发表于:2007-11-12 09:34:4710楼 得分:40
可以考虑一下!对修改的人进行分类,例如a只能操作字段a='001'的数据,
b只能操作字段b='002'的数据,c可以操作所有数据!
发表于:2007-11-15 09:58:3911楼 得分:0
可以考虑一下!对修改的人进行分类,例如a只能操作字段a=   '001   '的数据,  
b只能操作字段b=   '002   '的数据,c可以操作所有数据!
--------------
其实是有分类的,但是会有客户有相同的查询条件的。现在解决的办法是用   表锁。
如果能用行锁最好了。


快速检索

最新资讯
热门点击