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

3

我正在使用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中使用单个连接时,这样做很好,因此这必须是与连接池相关的问题。

任何帮助将不胜感激。


ER_LOCK_WAIT_TIMEOUT是一个锁超时的情况,其中一个会话超时(默认为50秒)。MySQL应该立即识别死锁情况并回滚,此时会出现错误ER_LOCK_DEADLOCK。 - Yoni Sade
1个回答

3

虽然我不太喜欢自问自答,但是这个问题可以通过明确从连接池创建连接,并在事务期间对每个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();
    }       
  });
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接