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    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值