序文 私はプログラマーとしてスタートした 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 以下もご興味があるかもしれません:
|
>>: Linux のバックグラウンドで実行するいくつかの方法 (まとめ)
GtkTreeView コンポーネントは、美しい通常のリストやツリーのようなリストを作成できる高度な...
序文低速システム コールとは、決して戻らない可能性があり、プロセスを永久にブロックするシステム コー...
目次1. 前に書く2. ポップアップウィンドウを実装するためのオーバーレイ2.1 vueページのad...
ここでは、あまり使われていない、または誤解されている 10 個の HTML タグを紹介します。あまり...
目次序文ローカルストレージの使用シナリオ使用上の問題解決機能性有効期限を追加データ暗号化を追加する命...
目次序文sudo書き込み権限を追加するgit 2.9.0をインストールopenssl 1.1.1l ...
1. 色合わせの問題<br />Web ページには 3 色以上使用しないでください。そう...
背景インデックスは諸刃の剣です。クエリ速度は向上しますが、DML 操作も遅くなります。結局のところ、...
方法1コードをコピーコードは次のとおりです。 document.getElementById(&qu...
すべてのプラットフォーム用の MySQL ダウンロードは、MySQL ダウンロードから入手できます。...
目次Vue ファースト スクリーン パフォーマンス最適化コンポーネント説明するインターセクションオブ...
セルデルとは何かuserdel は、ユーザーを削除するための低レベルのツールです。 Debian で...
目次グローバル変数として可変ホイスト一時的なデッドゾーンブロックスコープ重複したステートメント宣言さ...
目次安定スロットル: 手ぶれ防止: 一定時間内に最後のタスクのみを実行します。スロットル: 一定期間...
ビジネスシナリオ: 異なるデータベース内のテーブルをクエリするたとえば、関連付けられるテーブルは、マ...