Propagation.REQUIRES_NEW导致LockWaitTimeOutException

时间:2012-01-13 07:44:14

标签: 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(....){
    ...
}

导致

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

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

1 个答案:

答案 0 :(得分:4)

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