Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Giao dịch mysql Node.js

Cập nhật

Xem chỉnh sửa bên dưới để biết cú pháp async / await

Tôi đã dành một chút thời gian để viết một phiên bản tổng quát của ví dụ giao dịch được cung cấp bởi node mysql, vì vậy tôi nghĩ tôi sẽ chia sẻ nó ở đây. Tôi đang sử dụng Bluebird làm thư viện lời hứa của mình và sử dụng nó để 'quảng bá' đối tượng kết nối giúp đơn giản hóa logic không đồng bộ rất nhiều.

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);
        });
    });
}

Nếu bạn muốn sử dụng tính năng tổng hợp như bạn đã đề xuất trong câu hỏi, bạn có thể dễ dàng chuyển đổi createConnection dòng với myPool.getConnection(...) và chuyển connection.end dòng có connection.release() .

Chỉnh sửa

Tôi đã thực hiện một lần lặp lại mã bằng mysql2 thư viện (api giống như mysql nhưng với sự hỗ trợ hứa hẹn) và các toán tử async / await mới. Đây là

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. php và bản ghi mysql sao chép từ bảng này sang bảng khác

  2. Làm cách nào để tôi có thể chỉ chọn kết quả phù hợp riêng biệt đầu tiên từ một trường trong MySQL?

  3. Phân vùng MYSQL là gì?

  4. Cách sử dụng 'select' trong câu lệnh 'insert' MySQL

  5. Gỡ lỗi PDO - Xem truy vấn SAU KHI Ràng buộc?