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

I am using NodeJS and mysql library to access MySQL database.

When I establish single connection and repeatedly use it, it works fine:

global.mysql = mysql_module.createConnection({

host: config.mysql.host,

user: config.mysql.user,

password: config.mysql.password

});

When I use connection pool instead, I get ER_LOCK_WAIT_TIMEOUT errors in transactions.

global.mysql = mysql_module.createPool({

host: config.mysql.host,

user: config.mysql.user,

password: config.mysql.password,

database : config.mysql.database,

connectionLimit : 50

});

Strangely enough, the errors do occur on exactly the same data at exactly the same times.

I.e. I have transaction in which I insert in three tables in a row, each time using last inserted ID from previous INSERT statement. With some data this works fine, with some data, the third INSERT produces ER_LOCK_WAIT_TIMEOUT error. When I use single connection in NodeJS, this works fine, so this must be problem related to connection pool.

Any help would be appreciated.

解决方案

No a big fan of asnwering my own questions, but problem is solved by explicitly creating connection from a pool and using it for every sql statement during transaction

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();

}

});

});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值