相关疑难解决方法(0)

如何调试MySQL上的锁定等待超时?

在我的生产错误日志中,我偶尔会看到:

SQLSTATE [HY000]:常规错误:1205超出锁定等待超时; 尝试重新启动事务

我知道当时哪个查询正在尝试访问数据库,但有没有办法找出哪个查询在那个精确时刻有锁定?

mysql debugging innodb transactions acid

260
推荐指数
9
解决办法
39万
查看次数

Propagation.REQUIRES_NEW 导致 LockWaitTimeOutException

有两个函数 A 和 B 用事务注释定义。

我从 A 呼叫 B。

@Transactional(value=Constants.READ_WRITE_REQUEST)
public int A(....){
    B();
}

@Transactional(propagation=Propagation.REQUIRES_NEW,value=Constants.READ_WRITE_REQUEST)
public int B(....){
     C();        
}

@Transactional(value=Constants.READ_WRITE_REQUEST)
public int C(....){
    ...
}
Run Code Online (Sandbox Code Playgroud)

它导致了

Caused by: java.sql.SQLException: Lock wait timeout exceeded; try restarting transaction

    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)

    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)

    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3491)

    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3423)

    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)

    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)

    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2542)
Run Code Online (Sandbox Code Playgroud)

我从函数 B 中删除了 Propagation.REQUIRES_NEW,问题得到了解决。

是因为旧事务持有锁而创建了新事务吗?对此有何想法?

java spring transactions

2
推荐指数
1
解决办法
5195
查看次数

标签 统计

transactions ×2

acid ×1

debugging ×1

innodb ×1

java ×1

mysql ×1

spring ×1