由于是维护一个比较老的软件,开发工具用的是 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张表的保存,原本想不用事务保存的,但这样一旦一个表保存出错的话,之前保存成功的表回滚不了,
这样容易出现垃圾数据,所依事务这一环始终跨不过去。请各位大大看看问题到底出在哪,谢谢。
数据库查询更新是用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张表的保存,原本想不用事务保存的,但这样一旦一个表保存出错的话,之前保存成功的表回滚不了,
这样容易出现垃圾数据,所依事务这一环始终跨不过去。请各位大大看看问题到底出在哪,谢谢。
额发现delphi板块的GG们 就是豪爽,百分以上的帖子随处可见。
php板块就没那么……了 呵呵
2.在sql server测试一下
try
qryDCGDDetailM.ApplyUpdates;
提交事務
except
回滾事務
end;這樣試試你看看sqlserver中執行上述操作時,是不是有陰塞。