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

推薦する

ウェブサイトのコンテンツの一部を傍受するための iframe を実装するためのアイデアとコード

コードをコピーコードは次のとおりです。 <div スタイル="幅:630px;高さ:...

MySQL の自動増分主キーに関する詳細な説明

目次特徴保存戦略自己増加の決定自動増分値の変更実行プロセス問題点自動増分ロックロック戦略バッチ挿入の...

Vue のフィルターの適用シナリオの詳細な説明

filterは通常、特定の値をフィルターするために使用されます。たとえば、フィールドが空だが、フロン...

Tomcat が localhost に通常アクセスすると 404 を報告する問題の解決方法

今日、プロジェクトのホームページにアクセスするために Tomcat を設定していたところ、404 エ...

CocosCreatorで複数のタイマーを使用する方法の詳細な説明

1.タイムアウトを設定する3 秒後に abc を印刷します。一度だけ実行します。 setTimeou...

MySQL 8.0.17 winx64 (Navicat 付き) 手動構成バージョンのインストール チュートリアル図

1. ダウンロードアドレス: mysql-8.0.17-winx64ダウンロードして解凍する2. フ...

kubernetes1.5.2 から kubernetes1.10 にアップグレードする際の主要な設定変更記録

この記事では、kubernetes1.5.2 から kubernetes1.10 にアップグレードす...

Dockerイメージ内のnoneイメージ操作を削除する

普段はdocker buildコマンドでイメージを生成していますが、コードの更新が頻繁に行われるとn...

MySQL データベースのインストールと Navicat for MySQL の使用に関するチュートリアル

MySQL は、スウェーデンの会社 MySQL AB によって開発され、現在は Oracle が所有...

モバイルでのHTML5経由のファイルアップロード

ほとんどの場合、PC でファイルをアップロードするにはプラグインが使用され、フラッシュが導入されても...

言及すべき8つのMySQLの落とし穴を共有する

MySQL はインストールが簡単で、高速で、豊富な機能を備えています。これはオープンソース運動のベン...

Ubuntu での mysql のインストールと使用 (一般版)

Ubuntu のバージョンに関係なく、MySQL データベースのインストールは基本的に同じです。具...

MySQLのnull値に関する小さな問題

今日、null 値をテストしていたところ、小さな問題が見つかりました。ここに記録しました。以前にも遭...

mysql バックアップ戦略の実装 (フルバックアップ + 増分バックアップ)

目次設計シナリオ技術的なポイントサーバー情報準備フルバックアップスクリプト(Mysql-FullyB...

Web開発でボックスを中央に配置するいくつかの方法

1. ボックスを中央に配置するいくつかの方法を記録します。 1.0、マージン幅固定、高さ中央配置。 ...