PB中的Commit和RollBack

来源:互联网 发布:tcp客户端程序windows 编辑:程序博客网 时间:2024/05/18 01:56

PB中的Commit和RollBack  
   
  用PowerBuilder的人都肯定有用到过Commit(提交事务语句)和RollBack(回滚事务语句)。在理解上有一点是值得注意的,这里我想和大家一起来分享:  
  1、提交事务语句COMMIT  
  COMMIT语句提交事务,完成数据库的物理修改。执行该语句后,将关闭所有先前打开的游标(CURSOR)和过程(PROCEDURE),并开始一个新的事务。COMMIT语句的语法格式为:  
  COMMIT{USING   TransactionObject};  
  其中,TransactionObject是需要永久更新数据库的事务对象名,缺少时使用事务对象SQLCA。  
  2、回滚事务语句ROLLBACK  
  ROLLBACK(回滚)语放弃自上一个COMMIT、ROLLBACK或CONNECT语句以来的所有数据库操作,关闭所有的游标和过程,并开始一个新的事务。其语法格式为:  
  ROLLBACK{USING   TransactionObject};  
  其中,TransactionObject是事务对角名,缺少时使用事务对象SQLCA;  
  注意:在PB中应用最多的DataStore,而当在进行Commit,RollBack时,并没有清除DataStore中的内容。  
  案例:  
  ……  
  //数据更新  
  ll_returnvalue   =   lds_detail.Update(true,true)  
  If   ll_returnvalue   >   0   Then  
        st_text.Text   =   '店铺'+ls_site+'detail.dbf数据处理成功!'  
        ll_returnvalue   =   lds_inventory.Update(true,true)  
        If   ll_returnvalue   >   0   Then  
              st_text.Text   =   '仓存数据处理成功,正在提交…'  
              Commit   using   SQLCA;    
              st_text.Text   =   '恭喜,数据提交成功!'  
              f_readwrite('r')  
        Else    
              Rollback   using   SQLCA;  
              f_readwrite('e')  
        End   If  
  Else    
        Rollback   using   SQLCA;  
        f_readwrite('e')  
  End   If    
  ……  
   
      lds_detail(销售DataStore),lds_inventory(仓存Datastore)以上的代码在进行循环操作时,如果某个lds_detail更新失败,Rollback   using   SQLCA之后继续循环时,lds_detail由于功能需要会赋新值,而这时lds_inventory中的内容虽然没有更新,但内容还在。所在在继续循环时就会一次更新,产生意料之外的错误---数据不一致。  
   
  解决办法:  
   
          在每次Rollback后应即可释放(Destroy)或(Reset)DataStore。  
   
  正确代码:  
   
  ……  
  //数据更新  
  ll_returnvalue   =   lds_detail.Update(true,true)  
  If   ll_returnvalue   >   0   Then  
        st_text.Text   =   '店铺'+ls_site+'detail.dbf数据处理成功!'  
        ll_returnvalue   =   lds_inventory.Update(true,true)  
        If   ll_returnvalue   >   0   Then  
              st_text.Text   =   '仓存数据处理成功,正在提交…'  
              Commit   using   SQLCA;    
              st_text.Text   =   '恭喜,数据提交成功!'  
              f_readwrite('r')  
        Else    
              Rollback   using   SQLCA;  
              Destroy   lds_inventory     //或     lds_inventory.Reset()  
              f_readwrite('e')  
        End   If  
  Else    
        Rollback   using   SQLCA;  
        Destroy   lds_inventory     //或     lds_inventory.Reset()  
        f_readwrite('e')  
  End   If    
  ……    

原创粉丝点击