Propagation.REQUIRES_NEW вызывает исключение LockWaitTimeOutException - PullRequest
2 голосов
/ 13 января 2012

Есть две функции A и B, которые определены с помощью аннотации транзакции.

Я звоню B из A.

@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)

Я удалил Propagation.REQUIRES_NEW из функции B, и проблема была решена.

Это потому, что старая транзакция удерживала блокировку, а новая была создана?Есть мысли по этому поводу?

1 Ответ

4 голосов
/ 13 января 2012

Похоже, какая-то мертвая блокировка, две транзакции, внешняя (из A) и внутренняя (из B) имеют блокировку / попытку заблокировать один и тот же ресурс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...