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

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值