2012-01-13 130 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)有一个锁/尝试锁定相同的资源。

相关问题