[英]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.