トランザクション・メカニズムのロールバック・エラー
3024 ワード
シーン:ユーザーが現在提出する時、支付宝の単筆振り込みを呼び出し、企業がユーザーに振り込む.支払いをドッキングするときにロールバックが必要です.エラーの1つは、支払いインタフェースを呼び出してデータテーブルのデータを差し引くことです.次はエラーコードです.
正しい考え方はまずデータテーブルの中で残高があるかどうかをチェックして、残高があってこそユーザーに振り替えることができて、1つは間違いを報告して、1つは修正が成功しないので、この2つはすべてcommitの正しいコードを歩かない:
$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;