2012-01-13 15 views
2

Transactionalアノテーションで定義された2つの関数AとBがあります。Propagation.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

デッドロック、2つのトランザクションのように見えますが、外側(A)と内側(B)は同じリソースをロックしようとします。

関連する問題