簡體   English   中英

Node.js MySQL連接和事務

[英]Node.js mysql connection and transactions

大家好,

我試圖在我的應用上線之前將所有的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();
            } );
                } );
        } );

在開始事務之前,您需要從連接池中獲取一個連接,並在決定回滾的任何地方釋放它。 一旦遇到查詢錯誤/決定在任何其他情況下回滾,還應該回滾並釋放連接。 在當前代碼中,僅當提交事務時遇到錯誤時才回滾。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM