有两个函数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,问题得到了解决。
是因为旧事务持有锁而创建了新事务吗?对此有什么想法吗?
发布于 2012-01-13 16:27:15
看起来像某种死锁,两个事务,外部(来自A)和内部(来自B)有一个锁/尝试锁定相同的资源。
发布于 2021-09-26 17:02:26
我也有同样的问题,这是我的解决方案:
因为我不想立即执行方法B(),所以我使用了来自org.springframework.scheduling.annotation的注释@Async和函数B()来使其在单独的线程中执行。
PS:我的代码中没有value=Constants.READ_WRITE _REQUEST
https://stackoverflow.com/questions/8847377
复制相似问题