【问题标题】:Node.js mysql connection and transactionsNode.js mysql 连接和事务
【发布时间】:2017-12-07 08:19:16
【问题描述】:

大家好,

我尝试在使用我的应用程序之前将所有 mysql 插入、更新等更改为事务,我之前已经发布的连接遇到了很多麻烦,为了解决它我开始使用 pool.query 来处理发布本身。

    pool.query( 'INSERT INTO X SET ?', [ X ], ( error, results ) => {

            if(err){
                reject(err);
            }
            if ( error ) {
                reject( error );
            } else if ( results[ 0 ] !== 'undefined' ) {
                resolve( 'X added sucessfully' );
            } else {
                reject( error );
            }
                } );

我试过用谷歌搜索它,但在任何地方都找不到它,即使在 Mysql 的文档中,当你进行事务​​时,我在代码中的哪个位置释放连接,或者更好的是,我可以使用 pool.query什么时候做交易?

以下代码有效,但有时会给出连接已释放错误

      connection.beginTransaction( function ( err ) {
            if ( err ) {
                reject( err);
            }

        connection.query( 'INSERT INTO X SET ?', [ X ], ( error, results ) => {

            if(err){
                reject(err);
            }
            if ( error ) {
                reject( error );
            } else if ( results[ 0 ] !== 'undefined' ) {
                resolve( 'X added sucessfully' );
            } else {
                reject( error );
            }
            connection.commit( function ( commitErr ) {
                if ( commitErr ) {
                    connection.rollback( function () {
                        reject(commitErr);
                    } );
                }
          connection.release();
            } );
                } );
        } );

【问题讨论】:

    标签: javascript mysql node.js transactions


    【解决方案1】:

    您需要在开始事务之前从连接池中获取一个连接,并在您决定回滚的任何地方释放它。 您还应该在遇到查询错误/决定在任何其他情况下回滚时立即回滚并释放连接。在您当前的代码中,仅当您在提交事务时遇到错误时才会回滚。

    pool.getConnection(function(err, connection) {
        connection.beginTransaction(function(err) {
            if (err) { //Transaction Error (Rollback and release connection)
                connection.rollback(function() {
                    connection.release();
                    reject( err);
                });
            }
            connection.query('INSERT INTO X SET ?', [X], (error, results) {
                if (err) {       //Why is this here?
                    reject(err);
                }
                if (error) { //Query Error (Rollback and release connection)
                    connection.rollback(function() {
                        connection.release();
                        reject( err);
                    });
                } else if (results[0] !== 'undefined') {
                    resolve('X added sucessfully');
                } else {
                    reject(error);
                }
                connection.commit(function(commitErr) {
                    if (commitErr) {
                        connection.rollback(function() {
                            connection.release();
                            reject(commitErr);
                        });
                    }
                    connection.release();
                });
            });
        });
    });
    

    【讨论】:

      猜你喜欢
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-26
      • 2013-05-07
      相关资源
      最近更新 更多