Propagation.REQUIRES_NEW 导致 LockWaitTimeOutException

ins*_*ect 2 java spring transactions

有两个函数 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,问题得到了解决。

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

Ral*_*lph 6

看起来像某种死锁,两个事务,外部(from A)和内部(from B)有一个锁/尝试锁定相同的资源。

  • 恭喜。你发现了这个问题。解决办法是什么 (3认同)