MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

MYSQL トランザクション チュートリアル Yii2.0 マーチャント引き出し機能

序文

私はプログラマーとしてスタートした PHP プログラマーです。これまで、トレーニング コースで勉強した時間を除いて、2 年間コードを書いてきました。おそらく仕事上の理由から、私は過去 2 年間 MySQL トランザクションを使用していません。昨日、MySQL トランザクションを使用して完了する必要のある Alipay 送金に関する業務がありました。他の人から何度も説明を受けた後でも、MySQL トランザクションが何であるかまだ理解できませんでした。そのため、新しい補習授業を始めました。この世界で成功したいのであれば、借りた知識を返さなければなりません。

まず、昨日私が遭遇したビジネスについて簡単にお話しします。モバイル端末でAlipayの引き出しビジネスを開始したいと考えています。このビジネスを3つのステップで書きました。

最初のステップ:

まず、出金の場合、出金テーブルに出金レコードを書き込み、次にユーザー残高テーブルを更新する必要があります。これら 2 つのデータ レコードはどちらも出金前のレコードであり、ステータスが処理中であることを意味します。

ステップ2:

次に、Alipay のサードパーティ インターフェースをリクエストします。

ステップ3:

インターフェースリクエストが成功し、ユーザーがAlipayで支払った金額を受け取った場合、出金記録テーブルのステータスとユーザー残高テーブルのデータが更新されます。

インターフェース要求が失敗し、ユーザーが Alipay から送金されたお金を受け取らなかった場合、出金記録テーブルのステータスは出金失敗になります。

しかし、ユーザーが引き出しを開始すると、ユーザーの引き出し前業務はすでに実行されていますが、サードパーティの Alipay インターフェース要求が失敗し、この時点で突然の停電が発生し、データベースの状態を変更できず、結果が期待どおりになりません。現時点では、MySQL トランザクションはこの種のビジネスにおいてその価値を発揮します。

MySQL トランザクション: 実行される一連の操作はトランザクションと呼ばれ、トランザクション管理はこれらの操作が完全に実行されるか、まったく実行されないかを管理することです。つまり、上記の引き出し業務は正常に実行されるか、失敗に終わるかのどちらかであり、半分しか実行されない状況は発生しません。 MySQL トランザクションの目的は、データの整合性を確保することです。ただし、MySQL のすべてのデータ エンジンがトランザクション管理をサポートしているわけではなく、InnoDB のみがトランザクション管理をサポートしています。

トランザクション管理機能:

1. 原子性: トランザクションの操作全体が 1 つのまとまりであり、分割できません。すべてが成功するか、すべてが失敗します。

2. 一貫性: データ テーブル内のデータは、トランザクション操作の前後で変更されません。

3. 分離: トランザクション操作は互いに分離されており、影響を受けません。

4. 永続性: データが送信されると変更できなくなり、データ テーブルのデータは永続的に変更されます。

トランザクション管理操作:

トランザクション管理を有効にする: 有効にすると、次の SQL ステートメントはすぐに実行されず、結果はテーブルに書き込まれませんが、トランザクション ログに書き込まれます。

トランザクションを開始します。

ロールバック操作: ロールバックは、トランザクション管理の開始後にトランザクション ログに書き込まれた内容をクリアし、トランザクション管理を開始する前の状態に復元します。

構文: rollback;

注意:ロールバック操作では、「書き込まれた」コンテンツのみがロールバックされ、通常のテーブル読み取り選択ステートメントはロールバックできません。

トランザクションのコミット: SQL ステートメントの結果をデータ テーブルに書き込みます。

構文: commit;

サンプルコード:

/***
 * 注: 加盟店は Alipay から現金を引き出すことができます。* @著者: Dang Mengmeng
 * @日付: 2019/7/9 0009 10:01
 * @param $params
 * @return 混合
 * @throws BadRequestHttpException
 */
パブリック関数 storeWith($params){
 試す{
 $支払先アカウント = $params['支払アカウント'];
 $amount = $params['amount_of_acc'];
 $request = 新しい AlipayFundTransToaccountTransferRequest();
 $connection = Yii::$app->db;
 $transaction = $connection->beginTransaction(); //トランザクションを開始 //引き出し記録を書き込む $RES = StoreWith::updateWithData($x_id);
 $financeId = StoreWith::insertLog($params);
 $params['acc_id'] = $financeId;
 $paymentId = StoreWith::insertPaymentLog($params);
 $request->setBizContent("{" .
  "\"out_biz_no\":$orderId," .
  「\"payee_type\":\"ALIPAY_LOGONID\"," .
  "\"payee_account\":$payee_account," .
  「\"金額\":$金額」。
  「\"備考\":\"利益引き出し\"」。
  " }");
 $result = $aop->execute($request);
 $responseNode = str_replace(".", "_", $request->getApiMethodName()). "_response";
 $resultCode = $result->$responseNode->コード;
 if(!empty($resultCode) && $resultCode == 10000){
  //引き出し成功 $status = 1;
  //1. 入金された資金データのステータスを更新する StoreWith::updateWithDataTwo($x_id,$status);
 } それ以外 {
  //引き出しに失敗しました $status = 2;
  StoreWith::updateWithDataTwo($x_id、$status);
 }
 $結果コード == 10000の場合{
  $transaction->commit(); //トランザクションコミット}else{
  $transaction->rollBack(); //実行に失敗しました。トランザクションはロールバックされます}
 $resultCode を返します。
 }catch (\Exception $exception){
 新しい BadRequestHttpException をスローします($exception->getMessage());
 }
}

あなたが負っている知識の負債は必ず返済しなければなりません。遅れるよりは早く知る方が良いのです! ! !

遅く学ぶよりは早く学んだ方が良いので、できるだけ早く曲をお届けします。ハハハ! ! !

要約する

以上がこの記事の全内容です。この記事の内容が皆様の勉強や仕事に何らかの参考学習価値をもたらすことを願います。123WORDPRESS.COM をご愛顧いただき、誠にありがとうございます。

オリジナルリンク: https://www.cnblogs.com/honely/p/11156929.html

以下もご興味があるかもしれません:
  • MySQL のロングトランザクション例の詳細な説明
  • MySQLトランザクションとMySQLログの詳細な説明
  • MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明
  • MySQL トランザクションの概念と使用法の詳細な説明
  • MySQLのトランザクション管理操作の詳細な説明
  • MySQL トランザクション分離レベルの表示と変更の例
  • MySQL トランザクション、分離レベル、ロックの使用例の分析
  • MySQL でトランザクションのコミットとロールバックを実装する方法の詳細な例
  • MySQL でコミットされていないトランザクション情報を見つける方法
  • MySQLにおけるACIDトランザクションの実装原理の詳細な説明
  • MySQL クロスデータベーストランザクション XA 操作の例
  • MySQLのロングトランザクションに関する深い理解

<<:  NodeとPythonの双方向通信実装コード

>>:  Linux のバックグラウンドで実行するいくつかの方法 (まとめ)

推薦する

Reactはconetxtを通じてマルチコンポーネント値転送関数を実装します

この関数の効果はvue的provide/injectに似ています。 contextを通じて反応できる...

Vue3 でマークダウン エディター コンポーネントを使用する方法

目次インストールコンポーネントのインポート基本的な使い方保存したマークダウンまたは HTML テキス...

Dockerリポジトリの一般的なコマンドの詳細な説明

ログイン dockerログインdocker login コマンドを実行し、ユーザー名、パスワード、メ...

LeetCode の SQL 実装 (196. 重複するメールボックスを削除する)

[LeetCode] 196.重複したメールを削除するSQL クエリを記述して、Person とい...

Nginx+Apache の動的および静的分離の導入の詳細な例

Nginx の動的および静的分離の概要Nginx は静的処理能力が強力ですが、動的処理能力が不十分で...

jQueryはフォーム検証を実装する

jQueryを使用してフォーム検証を実装します。参考までに、具体的な内容は次のとおりです。登録.ht...

生年月日を年齢に変換し、グループ化して人数を数えるMySQLの例

データベースのクエリ `学生`から*を選択 クエリ結果id名前誕生日1張三1970-10-01 2李...

JavaScript デザインパターン プロキシパターンの学習

目次概要実装保護エージェント仮想エージェント画像の遅延読み込みを実現する仮想プロキシ概要プロキシ パ...

Docker Compose を使用して nginx のロード バランシングを実装する方法

Dockerネットワーク管理とコンテナIP設定に基づいてNginxロードバランシングを実装するすべて...

Webpackを使用して複数ページのプログラムを構築するための実装手順

webpack を使用してシングルページのプログラムを構築することは非常に一般的ですが、実際の開発で...

MySQLソートにおけるCASE WHENの使用例

序文以前のプロジェクトでは、SQL の CASE WHEN ソート関数が使用されました。ではブログメ...

MyBatisインターセプターのページング機能を実装する方法

MyBatisインターセプターのページング機能を実装する方法序文:まず、実装原則についてお話しします...

Unicode の一般的な文字の概要

初期のコンピューターのほとんどは ASCII 文字しか使用できませんでしたが、その後、主要な西洋のア...

CSS3 でテキスト ストロークを実装する 2 つの方法 (要約)

質問最近、以下に示すように、テキストストローク効果を実現するという要件に遭遇しました。 解決策1まず...