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

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

推薦する

プライベートウェアハウス(レジストリとハーバー)を構築するためのDockerの実装

使用される Docker イメージが増えるにつれて、イメージを保存する場所、つまりウェアハウスが必要...

nginx 設定の場所の概要の場所の通常の書き込みと書き換えルールの書き込み

1. 場所の正規表現例を見てみましょう: 場所 = / { # 完全一致 / 、ホスト名の後に文字列...

MySQL クエリ ステートメントのプロセスと EXPLAIN ステートメントの基本概念とその最適化

ウェブサイトやサービスのパフォーマンスは、データベースの設計(適切な言語開発フレームワークを選択した...

Windows での Apache+Tomcat7 負荷分散構成方法の詳細な説明

準備Windows Server 2008 R2 Enterprise (2.40GH、8GB、64...

MySQL 8.0.18 のインストールと設定方法のグラフィックチュートリアル (Windows 10 版)

この記事は、参考のためにMySQL 8.0.18のインストールと設定のグラフィックチュートリアルを記...

image/x-png の ContentType について

これにより、png ファイルのアップロードも不可能になりました (後で情報を調べたところ、レジストリ...

ウェブページで任意のフォントを使用する実践的な操作とデモ

以前、「Web ページにシステムに組み込まれていないフォントを埋め込む」という研究をしたことがありま...

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

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

新しい要素を作成する3つの方法のまとめ

1つ目: テキスト/HTML経由var txt1="<h1>テキスト。<...

Windows システムに MySQL を素早くインストールして展開する方法 (グリーンの無料インストール バージョン)

まずは緑色の無料インストール版のMySQLをダウンロードします。任意のフォルダに入れて構いません。今...

ウェブページヘッダーの最適化の提案

ロゴの最適化: 1.ロゴ画像はできるだけ小さくしてください。 2. 一般的には背景として配置されます...

Vue3 での watchEffect の使用に関する簡単な分析

序文誰もが vue2 の watch API に精通している必要があります。vue2 の vue イ...

React+Amapは緯度と経度をリアルタイムで取得し、住所を特定します

目次1. マップを初期化する2. マップポイント3. 位置決めを有効にする4. マップの変更を監視す...

バッチファイルを処理するLinuxの1行コマンドの詳細な説明

序文最良の方法は、あなたが思いつく最も速い方法ではないかもしれません。職場で一時的に使用するスクリプ...

Dockerデータを完全にクリーンアップする方法

目次定期的に剪定するミラーエビクションコンテナのクリーンアップネットワークソート体積の蒸発完全にクリ...