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 のバックグラウンドで実行するいくつかの方法 (まとめ)

ブログ    

推薦する

MySQL トランザクション自動コミット自動コミット操作

MySQL のデフォルトの動作モードは自動コミット モードです。つまり、明示的にトランザクションを開...

Amap を使用した React 実装例 (react-amap)

React の PC 版は Amap を使用するようにリファクタリングされました。情報を検索したと...

Vue カスタム オプション時間カレンダー コンポーネント

この記事の例では、参考のためにvueカスタムオプションタイムカレンダーコンポーネントの具体的なコード...

MySQL接続クエリの原理と応用

概要MySQL の最も強力な機能の 1 つは、データ取得を実行しながらテーブルを結合できることです。...

JavaScript における this ポイントの問題の詳細な説明

要約する地球環境 ➡️ ウィンドウ通常関数 ➡️ ウィンドウまたは未定義コンストラクター ➡️ 構築...

ffmpeg コマンドラインを使用してビデオを変換するためのサンプルコード

この記事の本文を始める前に、まず ffmpeg プログラムをインストールする必要があります (Lin...

DockerにRabbitMQを素早くインストールする方法

1. 画像を取得する #Webコントロールページを含むバージョンを指定します docker pull...

MySQL PXC クラスターの構築方法

目次1. PXCの紹介1.1 PXC の紹介1.2 PXC の特徴と利点1.3 PXCの限界と欠点1...

テーブルの幅を固定して、テキストによって幅が変わらないように設定

ページ内のテーブルの幅を width="600px" に設定した後も、幅が固定さ...

html-webpack-plugin の使用方法の詳細な説明

最近、React プロジェクトで初めてhtml-webapck-pluginプラグインを使用しました...

MySQLの自動増分IDについて知っておくべきこと

はじめに: MySQL を使用してテーブルを作成する場合、通常は自動インクリメント フィールド (A...

インデックスを設計する際の原則は何ですか? インデックスの障害を回避するにはどうすればよいでしょうか?

目次主キーインデックス頻繁にクエリされるフィールドのインデックスを作成する大きなフィールドのインデッ...

Javascript 文字列メソッドの詳細な説明

目次文字列の長さ: 長さcharAt() charCodeAt()文字列に値が含まれているかどうかを...

Linux デスクトップ用の 4 つのスキャン ツール

ペーパーレスの世界はまだ到来していませんが、書類や写真をスキャンすることで紙をなくす人が増えています...

Nginx を使用して rtmp ライブ サーバーを実行する方法

今回は、コンピューターや携帯電話用の rtmp ライブ ブロードキャスト サーバーを設定し、ライブ ...