关于一段SQL代码的执行效率(30分)

  • 主题发起人 主题发起人 ntjrr
  • 开始时间 开始时间
N

ntjrr

Unregistered / Unconfirmed
GUEST, unregistred user!
DELPHI+SQL2000 <br>datamoduleform.ADOConnection1.BeginTrans;<br>try<br>ADOQuery1.Close;<br>ADOQuery1.SQL.Clear;<br>ADOQuery1.SQL.Add('update 表一 set 单位=''dw'' where 1=2');<br>ADOQuery1.ExecSQL; //本处的执行是没有实质意义的,只是为了事务开始时对表一就加上U锁<br>ADOQuery2.Close;<br>ADOQuery2.SQL.Clear;<br>ADOQuery2.SQL.Add('select * from 表一 &nbsp;where id=:ypid');<br>ADOQuery2.Parameters.ParamByName('ypid').Value:=ypid;<br>ADOQuery2.Open;//从表一中取出所有字段的内容备用.<br>ADOQuery1.Close;<br>ADOQuery1.SQL.Clear;<br>ADOQuery1.SQL.Add('update 表一 set 数量=:sl,进价金额=:jjje where ID=:id' );<br>ADOQuery1.Parameters.ParamByName('sl').Value:=format('%.2f',[(ADOQuery2.FieldByName('数量').AsFloat-rksl)]);<br>ADOQuery1.Parameters.ParamByName('jjje').Value:=format('%.3f',[(ADOQuery2.FieldByName('进价').AsFloat)*(ADOQuery2.FieldByName('数量').AsFloat-rksl)]);<br>ADOQuery1.Parameters.ParamByName('id').Value:=ypid;<br>ADOQuery1.ExecSQL;<br>自我感觉好象写的复杂了一些,其实也就是要将当前表中的数量减去一个数量(rksl)而已<br>不知道如何改法比较效率高,并能考虑到多个用户同时使用时的数据并发问题,保证数量不修改错误.谢谢
 
记得在一条SQL语句中,就是一个事务.<br>何不将上述二条语句合并为一条呢?相信这样效率会有所提高.
 
ADOQuery1.Parameters.ParamByName('sl').Value:=format('%.2f',[(ADOQuery2.FieldByName('数量').AsFloat-rksl)]);<br>ADOQuery1.Parameters.ParamByName('jjje').Value:=format('%.3f',[(ADOQuery2.FieldByName('进价').AsFloat)*(ADOQuery2.FieldByName('数量').AsFloat-rksl)]);<br><br>没看懂后面的是干什么用的
 
其实我要做的就是将当前的数据库中的数量加上一个新数量<br>能不能直接写成<br>ADOQuery1.SQL.Add('update 表一 set 数量=数量-:新数量 &nbsp;where ID=:id' );<br>用不着象问题中写的那样,先单独写代码取出当前数量,再去减一个新数量?
 
ADOQuery1.Close;<br>ADOQuery1.SQL.Clear;<br>ADOQuery1.SQL.Add('update 表一 set 数量=数量-rksl,进价金额=(数量-rksl)*进价 &nbsp;where ID=:id' );<br>ADOQuery1.Parameters.ParamByName('id').Value:=ypid;<br>ADOQuery1.ExecSQL;
 
lbluebird前辈,这个代码用在事务中,应该不会在数据并发时有数量的错误产生吧?我在其它事务中都是一开始就用UPDATE的,没有一个事务是由SELECT开始的.
 
可以象lbluebird 写的那样合并为一条语句<br>如果只是一条语句, 加事务没有意义.
 
update 表一 set 单位=''dw'' where 1=2<br>这条语句也应该没有加锁, 不能防止并发. 因为1=2是一个空集, 没有锁定任何行
 
3868474前辈的意思是SQL后台数据库会自动排先后? 如果有十几个人用户同时执行这条命令有没有事?或者有其它用户同时对本表中的数量字段进行其它操作等也没事?谢谢!
 
一条命令当然会自动加上更新锁, 多条就不行了.
 
如果你的表加了索引, 数据库更新时会使用行级锁定.
 
多人接受答案了。
 
后退
顶部