用delphi做三层的进销存系统遇到的问题.多个客户端同时操作仓库表.会不会导致数据不正确?(50)

  • 主题发起人 softlong
  • 开始时间
S

softlong

Unregistered / Unconfirmed
GUEST, unregistred user!
如题,多个客户端同时操作仓库表.会不会导致数据不正确? 比如仓库里鞋子有500双第一个客户端和第二个客户端同时打开仓库表都读取鞋子500双,第一个客户端出了100双后保存(仓库里有400双) 第二个客户端出了200双(这时仓库里应该是200双 但第二个客户一旦更新数据了 仓库表就成了300双了 这个数据是错误的) 各位前辈 非要用事务处理吗? 事务处理是并发的吗还是队列的? 要是哪位前辈贴出客户端和服务器端的主要代码那就太好了...
 
用事务管理,交给数据库自己处理
 
锁记录,第一个客户保存更新的库存后才解锁让下一客户进去操作
 
在数据表中加入一个判断字段~~操作时,通过修改此字段来避免,还有就是在服务器端,建立操作队列控制,通过分配任务号,按先后顺序处理~~
 
用事务管理,交给数据库自己处理 ==>这个方法值得推荐.成本小.过账前,你再begin tran ...判断库存数量 ... COMMIT你在事务中,判断一下库存数量,则绝对不会出任何错!!!
 
设置服务器端DataProvider的UpdateMode为upWhereChanged,更新数据时,就会自动检查要修改的字段值是否改变,如果已经被别的用户修改,会提示已经被别的用户修改,跟新失败。
 
roadexplorer兄 不能让其他客户端不可操作这种做法是不认可的.de410兄 能不能把服务器端的队列控制实例发分给我呢?多谢多谢cgErp & aKnightChen兄 "过账前,你再begin tran ...判断库存数量 ... COMMIT 你在事务中,判断一下库存数量,则绝对不会出任何错!!! " 我的意思是在提交数据前别人已经把原始的数据读取出来了 当提交后 别人再提交的话就会出现数据错误了啊
 
数据库都有提供闩锁的功能,特别像ORACLE提供了行级锁,基本不存在冲突的问题。
 
luoyanqing119兄弟的意思是如果在服务器端使用了事务 数据库都是自动排队处理的?不会出现数据错误的问题?
 
自己顶一下....
 
在事务中,判断一下库存数量,则绝对不会出任何错!!! " 我的意思是在提交数据前别人已经把原始的数据读取出来了 当提交后 别人再提交的话就会出现数据错误了啊 。--------------他原先的意思可能是提交前再次读取数据。最好用存储过程来处理,存储过程中,处理前再次读取数据,那样肯定错不了的。类似的要求,我们都是这么处理的。
 
我们也遇到这种情况就是物流公司出仓选货的时候,在要取的那个库存上面写标记,提交完了之后就释放标记,这样就不会出问题了,下一个人要操作这一条数据的话要等标记释放之后才能操作。
 
锁的时候只是在操作的一瞬间
 
znxia兄弟的建议不错.卖女孩的小火柴之二,能不能贴段小实例来呢?谢谢你了
 
用三层的话,如果你用clientdataset 的delta来进行更新的话,一般不会出现你说的问题,如果任何一个客户发送更新,其他客户再更新的话就会报,record changed by another的错误。
 
我的解决方案是:库存表中设一LastDate字段,有库存增加和减少等操作后,修改为最新时间(当然要精确到秒)。客户端在更新库存前,用一存储过程取得库存记录的最新LastDate时间,再用这一时间同先前读取库时的LastDate比较,如果不同肯定是其他客户端在你读取库存同更新库存前修改过库存记录了。这时提示客户端库存已被修改过,须重新读取再操作。
 
用触发器,让数据库处理,在端出时数据库里激活触发器,然后数据库里操作库存,这个绝对不要怕的,因为数据库操作的时候有先来后到。。我新学的。感觉不错的。
 
观注。。。。
 
同意cgErp 用事务管理,交给数据库自己处理 在更新代码中加入:connection1.beginTrans;qry1.sql.text:='update tableName set num=num-xxx where id=12345';qry.execsql;connection1.commitTrans;加上事务后,当有客户更新时,数据库会自动加锁。(请参考SQL事务,锁)
 
一看就知道是一群刚出校门的学生。怎么能够这样考虑呢?要把出库的数量让sql来处理。否则。我出200双鞋子和出50箱鞋子。单位不一样你怎么解决啊。把一箱装了几双告诉SQL出库的时候告诉sql出的数量和单位。sql才能自动计算库存啊
 
顶部