2016-11-02 15 views
0

MySQLデータベースにアクセスするためにNodeJSとmysqlライブラリを使用しています。NodeJS + mysql:接続プールを使用するとデッドロックテーブルにつながる

私は、単一の接続を確立し、それを繰り返し使用する場合、それは正常に動作します:

global.mysql = mysql_module.createConnection({ 

     host: config.mysql.host, 
     user: config.mysql.user, 
     password: config.mysql.password 
    }); 

私が代わりに、接続プールを使用する場合、私は取引でER_LOCK_WAIT_TIMEOUTエラーが発生します。

global.mysql = mysql_module.createPool({ 

     host: config.mysql.host, 
     user: config.mysql.user, 
     password: config.mysql.password, 
     database : config.mysql.database, 
     connectionLimit : 50 
    }); 

奇妙なことに、奇妙なことに、奇妙なことに、正確に同じデータで正確に同じ時刻にエラーが発生します。 I.以前のステートメントから最後に挿入されたIDを使用するたびに、3つのテーブルに連続して挿入するトランザクションがあります。いくつかのデータでは、これはうまく動作し、いくつかのデータでは、INSERTER_LOCK_WAIT_TIMEOUTエラーを生成します。 NodeJSでシングル接続を使用すると、これは問題なく動作するため、接続プールに関連する問題でなければなりません。

ご協力いただければ幸いです。

答えて

0
ませ

ない私自身の質問にasnweringの大ファンが、問題は、明示的にプールから接続を作成し、トランザクション中のすべてのSQL文のためにそれを使用することによって解決される

pool.getConnection(function(err, connection) { 
    connection.query('START TRANSACTION', function(err, rows) { 
    // do all sql statements with connection and then 
    connection.query('COMMIT', function(err, rows) { 
     connection.release(); 
    }  
    }); 
}); 
関連する問題