2012-01-13 67 views
2

有兩個函數A和B與事務註釋中定義的。Propagation.REQUIRES_NEW引起LockWaitTimeOutException

我從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插入

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得到了解決。

是因爲舊的交易持有鎖而新的交易創建了嗎? 對此有何想法?

回答

4

看起來像某種死鎖,兩個交易,外部(從A)和內部(從B)有一個鎖/嘗試鎖定相同的資源。

相關問題