Propagation.REQUIRES_NEW导致LockWaitTimeOutException

有两个函数A和B,它们使用Transactional注释定义。

我是从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并解决了问题。

是因为旧事务持有锁并且创建了新事务? 有什么想法吗?

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