MySQLクエリトランザクション処理へのノード接続の実装

MySQLクエリトランザクション処理へのノード接続の実装

私は MySQL を何度も使用しており、主に NodeJS を扱っています。NodeJS nodejs mysqlデータベースに接続する方法について具体的に説明する記事を書きました。ご利用前に、お使いのパソコンが以下の環境を満たしているかご確認ください。

  • nodejs 実行環境。
  • MySQL データベース環境 (ダウンロード アドレス)。
  • Navicat は、MySQL データベースに接続するグラフィカル オペレーティング ソフトウェアです。 (オプション)

トピックmysqlの追加、削除、変更、クエリを入力します

まず、mysql という依存パッケージをダウンロードします。このパッケージは、nodejs コードを介してデータベースに接続し、データベースを操作します。

フォルダを作成し、 pakeage.jsonファイルを素早く生成します

D:\nodejs_mysql>npm init -y # パッケージ管理ファイルを素早く作成する

依存関係をインストールする

D:\nodejs_mysql>npm i mysql -D # mysql依存パッケージをインストールします

次のコードでindex.jsファイルを作成します。

定数 mysql = require("mysql");

// mysql接続プールを作成する const pool = mysql.createPool({
  host: "127.0.0.1", // データベースに接続するためのアドレス 127.0.0.1 はローカルの mysql です
  user: "root", // データベースに接続するためのユーザー名。root には最高権限があります。 password: "", // データベースに接続するためのパスワード。 database: "apm", // 操作用のデータベース名。 port: "3306", // MySQL に接続するためのポート番号。 multipleStatements: true, // 複数の SQL 文を一度に実行する場合は、この項目を無視できます。 });

関数select(){
  // mysqlへの接続要求
  pool.getConnection((err, 接続) => {
    // 接続が成功しなかった場合はエラーを報告します if (err) throw err;
    // 接続オブジェクトを取得し、クエリ メソッドを呼び出して SQL ステートメントを実行します。let sql = "select * from goods";
    // SQL ステートメントクエリを実行します。2 番目のパラメーターは SQL ステートメントに必要なパラメーターです。空白のままにすることができます。connection.query(sql, (errors, results, fields) => {
      // 接続を解放します connection.release();
      // SQL ステートメントの実行中にエラーが発生した場合は、エラーをスローします。if (errors) throw errors;
      console.log(結果);
      console.log(フィールド);
    });
  });
}

選択();

上記のコードは、 apmデータベース内のデータ テーブルgoodsのデータを照会します。 resultsデー​​タベースから取得されたデータです。

カプセル化メソッドはPromiseを使用してデータベースを照会します

// インデックス.js
// ... 前のコードを無視してMySQL接続プール関数を作成します query(sql, params) {
  新しい Promise を返します ((resolve, reject) => {
    pool.getConnection((err, 接続) => {
      // 接続が成功しなかった場合はエラーを報告します。if (err) return reject(err);
      // 接続オブジェクトを取得し、クエリメソッドを呼び出して SQL 文を実行します // SQL 文クエリを実行します 2 番目のパラメータは SQL 文に必要なパラメータで、省略できます connection.query(sql, params, (errors, results, fields) => {
        // 接続を解放します connection.release();
        // SQL ステートメントの実行中にエラーが発生した場合は、エラーをスローします。if (errors) return reject(errors);
        解決(結果);
      });
    });
  });
}

クエリ("商品から*を選択", null).then((結果) => {
  console.log(結果);
});
モジュール.エクスポート = {
  クエリ、
};

使用

// データ.js
定数index = require("./index.js");
var sql = "商品から*を選択";
索引
  .クエリ(sql, null)
  .then((結果) => {
    // 何でもする....
  })
  .catch((エラー) => {
    // エラー
    コンソールログ(エラー);
  });

これにより、データベースが SQL を実行するためのインターフェースが公開されます。 .thenを使用して、 promiseを通じて呼び出しを連鎖します。

MySQL トランザクション処理

MySQL トランザクションに関しては、あまり詳しく説明しません。参考までに、ここにリンクがあります。 MySQL トランザクション処理

早速本題に入り、 promiseを使用して MySQL事務處理をカプセル化してみましょう。

// インデックス.js

// .... プールを作成するコードの一部 /**
 * mysqlトランザクション処理 * @param {Array} sqls 実行されるSQL文 * @param {Array} 上記のSQL文のパラメータに対応するパラメータ * @returns {Promise} Promiseを返します
 */
関数トランザクション(sqls, params) {
  新しい Promise を返します ((resolve, reject) => {
    pool.getConnection(関数(err, connection) {
      // 接続に失敗したpromiseは、直接失敗を返しますif (err) {
        拒否(err)を返します。
      }
      // ステートメントとパラメータ番号が一致しない場合、promise は直接失敗を返します if (sqls.length !== params.length) {
        connection.release(); // 解放 return reject(new Error("ステートメントが渡された値と一致しません"));
      }
      // トランザクションの実行を開始する connection.beginTransaction((beginErr) => {
        // トランザクションの作成に失敗しました if (beginErr) {
          接続を解放します。
          拒否を返します(beginErr);
        }
        console.log("合計 " + sqls.length + " ステートメントのトランザクションの実行を開始します");
        // プロミス配列を返す let funcAry = sqls.map((sql, index) => {
          新しい Promise((sqlResolve, sqlReject) => { を返します
            constデータ = params[インデックス];
            connection.query(sql, データ, (sqlErr, 結果) => {
              (SQLエラー)の場​​合{
                sqlResolve(sqlErr) を返します。
              }
              sqlReject(結果);
            });
          });
        });
        // all メソッドを使用して、その中の各プロミスのステータスを確認します。Promise.all(funcAry)
          .then((arrResult) => {
            // 各SQL文が正常に実行されると、このポイントに到達します。ここで、トランザクションをコミットする必要があり、以前のSQL実行が有効になります。 // トランザクションをコミットします connection.commit(function (commitErr, info) {
              コミットエラーの場合
                // トランザクションの送信に失敗しました console.log("トランザクションの送信に失敗しました: " + commitErr);
                // トランザクションのロールバック、以前に実行されたSQL文が無効 connection.rollback(function (err) {
                  if (err) console.log("ロールバックに失敗しました: " + err);
                  接続を解放します。
                });
                // プロミスの失敗ステータスを返す return reject(commitErr);
              }

              接続を解放します。
              // トランザクションは各 SQL 実行の結果を配列構造として正常に返します。resolve(arrResult);
            });
          })
          .catch((エラー) => {
            // 複数のSQL文のうちの1つが実行中にエラーを報告した場合は、直接ロールバックします connection.rollback(function () {
              console.log("SQL 実行に失敗しました: " + エラー);
              接続を解放します。
              拒否(エラー);
            });
          });
      });
    });
  });
}
モジュール.エクスポート = {
  取引、
};

その後は、このメソッドを呼び出してmysqlトランザクションを実行するだけです。

// データ.js
定数index = require("./index.js");
var sqls = [
  "delete from goods where goods_id = ?"、// 削除ステートメント "update goods set num = ? where goods_id = ?;、// 更新ステートメント];
var パラメータ = [
  [1]、// parmasは配列形式であり、sqls?のsql文に対応します。[5、3]、
];

索引
  .transaction(sqls, パラメータ)
  .then((arrResult) => {
    // 何でもする....
  })
  .catch((エラー) => {
    // エラー
    コンソールログ(エラー);
  });

ノード接続mysqlクエリトランザクション処理の実装に関するこの記事はこれで終わりです。より関連性の高いノード接続mysqlクエリトランザクション処理コンテンツについては、123WORDPRESS.COMの以前の記事を検索するか、次の関連記事を引き続き参照してください。今後も123WORDPRESS.COMを応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySQL XA で分散トランザクションを実装する方法
  • MySQL データベース トランザクション例のチュートリアル
  • MySQL と Golan 間の従来の分散トランザクションのための 7 つのソリューション
  • MySQLトランザクションが効率に与える影響の分析と概要
  • MySQL トランザクション分離レベルの詳細
  • MySQLデータベースのトランザクションとインデックスの詳細な説明
  • MySQL トランザクション分析

<<:  MySQL データベース分離レベルと MVCC の詳細な説明

>>:  入力ボックスのオートコンプリート機能をオフにする

推薦する

Windows Apache 環境で SSL 証明書を展開して、Web サイトを https 対応にする方法

SSL 証明書の使用についてはここでは説明しません。SSL 証明書を導入する必要がある友人は、すでに...

IDEA が docker を統合して springboot プロジェクトを展開するプロセス全体

目次1. IDEAはdockerプラグインをダウンロードします2. クラウドサーバーDocker 2...

サーバー上で Nginx を使用して Springboot プロジェクトをデプロイする方法の詳細なチュートリアル (jar パッケージ)

1. Javaプロジェクトをjarパッケージにパッケージ化するここではMavenツールを使用します...

js タグ構文の使用法の詳細

目次1. ラベルステートメントの紹介2. ラベルステートメントの使用序文:日常の開発では、プログラム...

負の距離(共感) - 相互影響の反復プロセス

ネガティブな距離は共感を意味します。序文(疑問の提起):プロダクトマネージャーは機能を把握します。機...

MySQL のインストール方法と設定に関するいくつかの問題の概要

1. MySQL rpm パッケージのインストール # インストールソースをダウンロードします [r...

MySQL データベース インデックスが B+ ツリーの使用を選択するのはなぜですか?

MySQL データベース インデックスが B+ ツリーを使用する理由をさらに分析する前に、データ構...

Vue が天気予報機能を実装

この記事では、天気予報機能を実現するためのVueの具体的なコードを参考までに共有します。具体的な内容...

Squid を使用して http および https 用のプロキシ サーバーを構築する方法

nginx を導入した際に、フォワードプロキシの設定も nginx を使っていました。しかし、htt...

nginx がアップストリーム アドレスにジャンプしない問題の解決方法

序文今日、nginx で非常に奇妙な問題に遭遇しました。フロントエンドの tomcat がページにジ...

CSSがページのレンダリングをブロックするかどうかについての簡単な説明

おそらく誰もが js の実行によって DOM ツリーの解析とレンダリングがブロックされることを知って...

Hadoop 3.2.0 クラスターの構築に関する一般的な考慮事項

1つのポートの変更バージョン 3.2.0 では、ネームノード ページ ポートは 9870、データノー...

ElementUIはカスケードセレクタを実装します

この記事の例では、カスケードセレクターを実装するためのelementUIの具体的なコードを参考までに...

CSS3で実装された3Dトンネル効果

達成された効果実装コードhtml <div class="scene"&g...

Vueプロジェクトをパッケージ化してリリースする手順

目次1. 開発環境から本番環境への移行2. 統一されたリクエストパスを設定する3. パッケージ化コマ...