Propagation.REQUIRES_NEW导致LockWaitTimeOutException异常

5

有两个带有Transactional注解的函数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(....){
    ...
}

它导致了什么?(这句话需要上下文才能确定最准确的翻译)
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)

我从函数B中移除了Propagation.REQUIRES_NEW,问题得到了解决。
是因为旧的事务正在持有锁,而新的事务被创建了吗? 对此有什么想法吗?

这些方法是否位于同一个类中? - undefined
2个回答

7

看起来像是一种死锁情况,两个事务,外部事务(来自 A)和内部事务(来自 B)都锁定或尝试锁定同一个资源。


3
恭喜你,你找到了问题所在。解决方案是什么? - TheRealChx101
@Ralph 有什么解决方案的建议吗? - undefined

1
我曾经遇到过同样的问题,这是我的解决方案:
由于我不在意立即执行方法B(),所以我使用了来自org.springframework.scheduling.annotation的注释@Async和函数B(),使其在单独的线程中执行。
PS:我的代码中没有value=Constants.READ_WRITE_REQUEST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接