Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Transaksi mysql Node.js

Perbarui

Lihat hasil edit di bawah untuk sintaks async/await

Saya menghabiskan beberapa waktu menulis versi umum dari contoh transaksi yang diberikan oleh node mysql, jadi saya pikir saya akan membagikannya di sini. Saya menggunakan Bluebird sebagai perpustakaan janji saya, dan menggunakannya untuk 'menjanjikan' objek koneksi yang sangat menyederhanakan logika asinkron.

const Promise = ('bluebird');
const mysql = ('mysql');

/**
 * Run multiple queries on the database using a transaction. A list of SQL queries
 * should be provided, along with a list of values to inject into the queries.
 * @param  {array} queries     An array of mysql queries. These can contain `?`s
 *                              which will be replaced with values in `queryValues`.
 * @param  {array} queryValues An array of arrays that is the same length as `queries`.
 *                              Each array in `queryValues` should contain values to
 *                              replace the `?`s in the corresponding query in `queries`.
 *                              If a query has no `?`s, an empty array should be provided.
 * @return {Promise}           A Promise that is fulfilled with an array of the
 *                              results of the passed in queries. The results in the
 *                              returned array are at respective positions to the
 *                              provided queries.
 */
function transaction(queries, queryValues) {
    if (queries.length !== queryValues.length) {
        return Promise.reject(
            'Number of provided queries did not match the number of provided query values arrays'
        )
    }

    const connection = mysql.createConnection(databaseConfigs);
    Promise.promisifyAll(connection);
    return connection.connectAsync()
    .then(connection.beginTransactionAsync())
    .then(() => {
        const queryPromises = [];

        queries.forEach((query, index) => {
            queryPromises.push(connection.queryAsync(query, queryValues[index]));
        });
        return Promise.all(queryPromises);
    })
    .then(results => {
        return connection.commitAsync()
        .then(connection.endAsync())
        .then(() => {
            return results;
        });
    })
    .catch(err => {
        return connection.rollbackAsync()
        .then(connection.endAsync())
        .then(() => {
            return Promise.reject(err);
        });
    });
}

Jika Anda ingin menggunakan penyatuan seperti yang Anda sarankan dalam pertanyaan, Anda dapat dengan mudah mengganti createConnection baris dengan myPool.getConnection(...) , dan alihkan connection.end baris dengan connection.release() .

Sunting

Saya membuat iterasi lain dari kode menggunakan mysql2 library (api yang sama dengan mysql tetapi dengan dukungan janji) dan operator async/menunggu yang baru. Ini dia

const mysql = require('mysql2/promise')

/** See documentation from original answer */
async function transaction(queries, queryValues) {
    if (queries.length !== queryValues.length) {
        return Promise.reject(
            'Number of provided queries did not match the number of provided query values arrays'
        )
    }
    const connection = await mysql.createConnection(databaseConfigs)
    try {
        await connection.beginTransaction()
        const queryPromises = []

        queries.forEach((query, index) => {
            queryPromises.push(connection.query(query, queryValues[index]))
        })
        const results = await Promise.all(queryPromises)
        await connection.commit()
        await connection.end()
        return results
    } catch (err) {
        await connection.rollback()
        await connection.end()
        return Promise.reject(err)
    }
}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wampserver 2.1 memberikan ikon oranye setelah menginstal pada Windows 7

  2. Mysql untuk memilih catatan per bulan meskipun data tidak ada

  3. Apa itu tabel Induk dan tabel Anak di Database?

  4. Bagaimana cara memilih baris data pertama dan terakhir dari hasil mysql?

  5. Penanganan &Pembatasan Koneksi dengan ProxySQL