$model_name = new ....$model_member = new ...$model_account = new ...$model_name->beginTransaction();//位置1
if(!$model_name->query(.....)){
//失败回滚
$model_name->rollback();
}
//位置2
//对象发生变化
if(!$model_member->query(.....)){
//失败回滚
$model_name->rollback();
}
//位置3
//对象发生变化
if(!$model_account->query(.....)){
//失败回滚
$model_name->rollback();
}当位置3出错时,事务回滚,位置1的sql未提交,位置2的sql提交了,这种情况怎么解决?
表都是事务表
问题是不是出在实例上面

解决方案 »

  1.   

    一滚整个事务都滚了。事务就是一组操作,你没commit的话实际上是不会动数据库一根汗毛的。
      

  2.   

    //订单模型
    $oOrderModel = Model_EcmOrder::getInstance();
    $oOrderModel->beginTransaction();
    //位置1
             if(!$oOrderModel->edit($value['order_id'], array('freeze_state' =>'1')))
             {
             //执行失败回滚事务
             $oOrderModel ->rollBack();
             return ;
             }
            
             $query = "UPDATE ii_account SET ......";
    $oAccountModel = Model_Account::getInstance();
    //位置2
             if(!$oAccountModel->query($query)){
             //注意这里是用开启事务的句柄执行回滚事务的
             $oOrderModel ->rollBack();
             return ;
             }
             $oAccountLog = Model_AccountLog::getInstance();
            
             $acclog = "INSERT INTO ii_account_log .......";
             //位置3
             if(!$oAccountLog->query($acclog)){
             //注意这里是用开启事务的句柄执行回滚事务的
             $oOrderModel ->rollBack();
             return;
             }
             $oOrderModel->commit();
             //模型 Model_EcmOrder Model_Account Model_AccountLog 都继承 baseModel 
             // baseModel 中有方法 beginTransaction() rollBack() ...