2012-01-13 4 views
2

Transactional 주석으로 정의 된 두 개의 함수 A와 B가 있습니다.전파 .REQUIRES_NEW로 인해 LockWaitTimeOutException이 발생합니다.

는 내가 해결있어 함수 B와 문제에서 Propagation.REQUIRES_NEW을 제거

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) 

에 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(....){ 
    ... 
} 

그것은 결과되었다에서 B를 호출하고 있습니다.

이전 트랜잭션이 잠금을 유지하고 새 트랜잭션이 생성 되었기 때문에 그렇습니까? 이것에 대한 의견이 있으십니까?

답변

4

어떤 종류의 데드락, 두 트랜잭션, 외부 (A)와 내부 (B)는 같은 리소스를 잠그려고합니다.

관련 문제