복붙노트

[SPRING] 전파 .REQUIRES_NEW로 인해 LockWaitTimeOutException이 발생 함

SPRING

전파 .REQUIRES_NEW로 인해 LockWaitTimeOutException이 발생 함

Transactional annotation으로 정의 된 두 개의 함수 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. ==============================

    1.죽은 자물쇠, 2 개의 트랜잭션, 바깥 쪽 (A에서)과 안쪽 (B에서)이 같은 리소스를 잠그려고 시도하는 것처럼 보입니다.

    죽은 자물쇠, 2 개의 트랜잭션, 바깥 쪽 (A에서)과 안쪽 (B에서)이 같은 리소스를 잠그려고 시도하는 것처럼 보입니다.

  2. from https://stackoverflow.com/questions/8847377/propagation-requires-new-causing-lockwaittimeoutexception by cc-by-sa and MIT license