NodeJS + mysql:使用连接池导致死锁表

时间:2016-11-02 11:03:14

标签: mysql node.js connection-pooling deadlock

我使用NodeJS和mysql库来访问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
    });

奇怪的是,错误确实在完全相同的时间发生在完全相同的数据上。 即我有一个事务,我连续插入三个表,每次使用上一个INSERT语句中的最后一个插入ID。对于某些数据,这种方法很好,对于某些数据,第三个INSERT会产生ER_LOCK_WAIT_TIMEOUT错误。当我在NodeJS中使用单个连接时,这样可以正常工作,因此这必须与连接池有关。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

没有大肆宣传我自己的问题,但问题是通过从池中显式创建连接并在事务期间将其用于每个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();
    }       
  });
});