トランザクション・メカニズムのロールバック・エラー

3024 ワード

シーン:ユーザーが現在提出する時、支付宝の単筆振り込みを呼び出し、企業がユーザーに振り込む.支払いをドッキングするときにロールバックが必要です.エラーの1つは、支払いインタフェースを呼び出してデータテーブルのデータを差し引くことです.次はエラーコードです.
$arr = MyPdo::instance()->getOne('balance', 'membership', ['uid' => $uid]);
        try{
            MyPdo::instance()->beginTransaction();
            if (!empty($arr)) {
                $ret = Transfer::run(Config::ALI_TRANSFER, $aliConfig, $data);
                if($ret['msg']=="Success") {
                    //       ,    
                    MyPdo::instance()->decValue('membership',$amount,$uid);
                    $result = ['code' => 0, 'message' => "           ", 'data' => $ret['order_id']];
                    show_json($result);
                }else{
                    $result = ['code' => 4001, 'message' => "    ", 'data' => false];
                    show_json($result);
                }
            }else{
                $result = ['code' => 3001, 'message' => "      ", 'data' => false];
                show_json($result);
            }

            //    
            MyPdo::instance()->commit();
        }catch (Exception $e){
            MyPdo::instance()->rollback();
//            $this->returnMessage(2001,$e->errorMessage(),false);
      
        }

正しい考え方はまずデータテーブルの中で残高があるかどうかをチェックして、残高があってこそユーザーに振り替えることができて、1つは間違いを報告して、1つは修正が成功しないので、この2つはすべてcommitの正しいコードを歩かない:
$arr = MyPdo::instance()->getOne('balance', 'membership', ['uid' => $uid]);
        $message = ['code' => 2001, 'message' => "    ", 'data' =>false];

        try{
            MyPdo::instance()->beginTransaction();
            $result=false;
            if (!empty($arr)) {
                $result=MyPdo::instance()->decValue('membership',$amount,$uid);
                if($result) {
                    //       ,    
                    $ret = Transfer::run(Config::ALI_TRANSFER, $aliConfig, $data);
                    $message = ['code' => 1001, 'message' => "           ", 'data' => $ret['order_id']];

                }else{
                    $message = ['code' => 4001, 'message' => "    ", 'data' => false];
                }
            }else{
                $message = ['code' => 3001, 'message' => "      ", 'data' => false];

            }
            if($result){
                MyPdo::instance()->commit();
            }else{
                MyPdo::instance()->rollback();
            }

        }catch (PDOException $e){
          MyPdo::instance()->rollback();
          //          
         return $this->returnMessage(2001,$e->getMessage(),false);
        }
        return $message;