NodeJS + mysql: 使用连接池导致表死锁
NodeJS + mysql: using connection pool leads to deadlock tables
我正在使用 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
});
奇怪的是,错误确实在完全相同的时间发生在完全相同的数据上。
IE。我有一个事务,我在其中连续插入三个表,每次都使用前一个 INSERT
语句中最后插入的 ID。对于一些数据,这工作正常,对于一些数据,第三个 INSERT
产生 ER_LOCK_WAIT_TIMEOUT
错误。当我在NodeJS中使用单连接时,这工作正常,所以这一定是与连接池有关的问题。
如有任何帮助,我们将不胜感激。
不太喜欢回答我自己的问题,但这个问题已通过从池中显式创建连接并在交易期间为每个 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();
}
});
});
我正在使用 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
});
奇怪的是,错误确实在完全相同的时间发生在完全相同的数据上。
IE。我有一个事务,我在其中连续插入三个表,每次都使用前一个 INSERT
语句中最后插入的 ID。对于一些数据,这工作正常,对于一些数据,第三个 INSERT
产生 ER_LOCK_WAIT_TIMEOUT
错误。当我在NodeJS中使用单连接时,这工作正常,所以这一定是与连接池有关的问题。
如有任何帮助,我们将不胜感激。
不太喜欢回答我自己的问题,但这个问题已通过从池中显式创建连接并在交易期间为每个 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();
}
});
});