由于是维护一个比较老的软件,开发工具用的是 DELPHI5+SQL server2000+BDE.
数据库查询更新是用Tquery和Tupdatesql
现在在软件操作在做单据时:修改明细表-删除其中一条明细-新增一条相同的明细-点保存-软件就没响应了
Tquery:DPFDDetailM 
SQL为
SELECT *FROM DPFDDetailM  INNER JOIN
     ISPinfo ON DPFDDetailM .SPid = ISPinfo.SPid 
where DPFDDetailM .DJBH=:DJBH 
查出单据的所有明细
选中一条修改,删除一条明细:
      qryDCGDDetailM.Delete;
      qryDCGDDetailM.Edit;
继续添加其它明细后保存:
CommonDM.DataBase1.StartTransaction;//启动事务
qryDCGDDetailM.ApplyUpdates;//无响应了TUpdateSQL里的增删改分别为:
delete是
delete from DPFDDetailM
where
  DJBH = :OLD_DJBH and
  SPid = :OLD_SPid insert是
insert into DPFDDetailM
  (DJBH, SPid, SLTotal, BYTotal, CKJmoney, ZZKdiscount, DJmoney, JEmoney, 
   JEmoney1, BZ)
values
  (:DJBH, :SPid, :SLTotal, :BYTotal, :CKJmoney, :ZZKdiscount, :DJmoney, 
   :JEmoney, :JEmoney1, :BZ)modefy是
update DPFDDetailM
set
  DJBH = :DJBH,
  SPid = :SPid,
  SLTotal = :SLTotal,
  BYTotal = :BYTotal,
  CKJmoney = :CKJmoney,
  ZZKdiscount = :ZZKdiscount,
  DJmoney = :DJmoney,
  JEmoney = :JEmoney,
  JEmoney1 = :JEmoney1,
  BZ = :BZ
where
  DJBH = :OLD_DJBH and
  SPid = :OLD_SPid 
其中DJBH 和 SPid 是表的主键,DJBH 在新增行时自动填入现在奇怪的问题出来了:
1、这样的操作并不是都会没响应,但几率很频繁
2、不启动事务的话问题消失(//CommonDM.DataBase1.StartTransaction;)
   qryDCGDDetailM.ApplyUpdates;
3、只要新增的数据的spid等于刚才删除的spid,新增后无论再新增其它什么明细都会出现无响应现象出现阻塞后后台查询数据库sp_who
spid    ecid    status    loginame    hostname   blk   dbname   cmd61       0      sleeping   sa          zy         0     lszb    AWAITING COMMAND
62       0      RUNNABLE   sa          zy         0     lszb    select
63  0 sleeping   sa              60    lszb    insert
由于一张完整单据保存要涉及到3张表的保存,原本想不用事务保存的,但这样一旦一个表保存出错的话,之前保存成功的表回滚不了,
这样容易出现垃圾数据,所依事务这一环始终跨不过去。请各位大大看看问题到底出在哪,谢谢。

解决方案 »

  1.   

    ……up 
    额发现delphi板块的GG们 就是豪爽,百分以上的帖子随处可见。
    php板块就没那么……了 呵呵 
      

  2.   

    1.建议把bde改成ado,工作量不是很大,问题也应该不会很多
    2.在sql server测试一下
      

  3.   

    ps:就算只把这个功能改成ado也比较好,bde对sql server的支持不太好了,像事务这样的东东还是用ado吧,ms的东西比较合适他自己用
      

  4.   

    開啟事務
    try
      qryDCGDDetailM.ApplyUpdates;
      提交事務
    except
     回滾事務
    end;這樣試試你看看sqlserver中執行上述操作時,是不是有陰塞。
      

  5.   

    63 0 sleeping  sa             60    lszb    insert 63被60锁住了,查一下60是什么进程吧!