Lock wait timeout exceeded; try restarting transaction
数据库锁等待:
/**
* 释放资源,当小于初始化的值时加入,否则关闭资源
* @param connection
*/
public void releaseConnection(Connection connection) {
if(connection != null) {
lock.lock();
try {
currentCount--;
if (pool.size() < Transform.parseInt(maxActive,0)) {
try {
//要重新设置会 true,否则 到时在用到这个connection不会自动提交,导致锁等待
connection.setAutoCommit(true);
} catch (SQLException throwables) {
throwables.printStackTrace();
}
pool.addLast(connection);
} else {
try {
connection.close();
} catch (SQLException throwables) {
throwables.printStackTrace();
}
}
// 唤醒线程
if(currentCount < Transform.parseInt(maxActive,0)) {
condition.signalAll();
}
} finally {
lock.unlock();
}
}
}
在手写连接池时加上事务时,如果在重新利用connection
忘记 connection.setAutoCommit(true)
,就会报出如下错误:
Lock wait timeout exceeded; try restarting transaction
解决
加上:connection.setAutoCommit(true)
补充:
在mysql
中通过一下的命令,可以查看线程有关的信息(包括状态)
SELECT * FROM information_schema.INNODB_TRX