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 の詳細な説明

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

推薦する

MySQL 8.0 をインストールした後、初めてログインするときにパスワードを変更する問題を解決する

MySQL 8.0.16で初回ログイン時のパスワードを変更する方法を紹介します。 MySQLデータベ...

角度に基づくツリー型セカンダリテーブルを実現する

まず効果を見てみましょう: コード: 1.html <div class="user...

Linuxカーネルの浮動小数点演算のサポートに関する簡単な説明

現在、ほとんどの CPU は浮動小数点ユニット (FPU) をサポートしています。FPU は、プロセ...

dockerを使用してdubboプロジェクトをデプロイする方法

1. まず、Springbootを使用して簡単なDubboテストプログラムを構築し、関連する依存関係...

Windows で Nginx を使用して https サーバーとリバース プロキシを構成する際の問題

リクエストロジックフロントエンド --> https経由でnginxをリクエストnginx -...

ウェブページの内部アンカーポイントを実現するための純粋なCSSの上下オフセットコード例

最近、「フットボール ナビゲーション」Web サイトに取り組んでいるときに、上部の固定ナビゲーション...

IDEA 構成の Tomcat 起動エラーの問題を解決する

異なるサーブレット パスを構成するときに、次の 2 つのエラーが発生しました。 java.lang....

Windows SSHサーバーを簡単に構築するためのいくつかの手順

ここで言及されている SSH は Security Shell と呼ばれます。Linux をよく使用...

Linux で pip 操作中にタイムアウトが発生する問題を解決する方法

Linuxインスタンスでpipを使用する際のタイムアウト問題を解決する方法pip は最も人気のある ...

MySQL 5.7.18 インストールチュートリアルと問題の概要

MySQL 5.7.18 のインストールと問題の概要。今日、新しい MySQL サーバーを導入しまし...

クラウドネイティブテクノロジーKubernetesスケジューリングユニットポッドの使用の詳細な説明

k8s の最小のスケジューリング単位 --- pod前回の記事では、k8s が解決できる問題を簡単に...

JavaScript 配列メソッド - 体系的な概要と詳細な説明

目次一般的な配列メソッド配列要素の追加と削除配列ヘッダーの操作配列の末尾を操作する任意の場所に追加ま...

Webpack でよく使われる 12 個の Loader を共有する (要約)

目次序文スタイルローダーCSSローダーsassローダーpostcssローダーバベルローダーtsローダ...

Avue でカスタム検索バーを実装し、検索イベントをクリアする実践

目次1. 検索バーの内容をカスタマイズする2. 検索ボタンをカスタマイズする検索バーをカスタマイズし...

MySQLインデックスマージの使い方

インデックスのマージは、MySQL が最下層で提供するインテリジェントなアルゴリズムです。インデック...