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

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

推薦する

HTML5+CSS3 ヘッダー作成例と更新

前回、私たちは 2 つのヘッダー レイアウト (フレックスボックス 1 つとフロート 1 つ) を考...

iframe テクニックを使用して訪問者 QQ 実装のアイデアとサンプル コードを取得する

今日、仕事中に、一時的に追加した友人から、Web ページを使用して訪問者の QQ を取得する方法を尋...

MySQL パフォーマンス チューニングについて知っておくべき 15 個の重要な変数 (要約)

序文: MYSQL は最も人気のある WEB バックエンド データベースです。最近、NOSQL がま...

MySQLのインデックス選択と最適化の詳細な説明

目次インデックスモデルB+ツリーインデックスの選択インデックスの最適化インデックスの選択性カバーイン...

血の写輪眼と輪廻眼の特殊効果コードを実現するためのHTML+CSS

結果 (完全なコードは下部にあります): 実装は難しくありませんが、繰り返しコードが多くなります。実...

jQuery でダイナミックなパーティクル効果を実現

この記事では、動的なパーティクル効果を実現するためのjQueryの具体的なコードを参考までに紹介しま...

Docker コンテナの正常なシャットダウン前にトラップを使用して環境のクリーンアップを実行する

実行中のコンテナが終了したときに、コンテナが完全に終了する前に環境をクリーンアップするなど、いくつか...

MySQL UPDATE ステートメントの非標準実装コード

今日は、MySQL データベースと SQL 標準 (および他のデータベース) の UPDATE ステ...

React コンポーネントのコンストラクタとスーパーの知識ポイントのまとめ

1. Reactでクラス宣言する際のヒント 上記のように、Child クラスは class キーワー...

モバイルデバイスでインラインスクロールを実装するための4つのソリューションの詳細な説明

ニーズの発見領域の一部のみスクロールでき、残りの部分は移動できない場合、どのような方法を使用しますか...

MySQLは効率的なインデックス例分析を確立する

この記事では、例を使用して、MySQL で効率的なインデックスを作成する方法について説明します。ご参...

Ubuntu 18.04 で apt-get ソースを変更する方法

apt-get を使用してインストールすると、非常に遅くなります。国内のソースを変更すると、この問題...

Linux resolv.conf の簡単な分析

1. はじめにresolv.conf は、さまざまなオペレーティング システムのドメイン ネーム シ...

Vueルータールーティングの詳細な説明

目次1. 基本的な使い方2. 注意すべき点3. マルチレベルルーティング(マルチレベルルーティング)...

vmware workstation12 インストール CentOS プロンプト VMware Player と Device/Credential Guard に互換性がない、理由と解決策

最新バージョンの WIN10 では、Microsoft は仮想化コンテナに基づくセキュリティ メカニ...