首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >导致LockWaitTimeOutException的Propagation.REQUIRES_NEW

问导致LockWaitTimeOutException的Propagation.REQUIRES_NEW
EN

Stack Overflow用户
提问于 2012-01-13 15:44:14
回答 2查看 5.5K关注 0票数 2

有两个函数A和B,它们是用事务性注释定义的。

我从A呼叫B。

代码语言:javascript
复制
@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(....){
    ...
}

它导致了

代码语言:javascript
复制
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,问题得到了解决。

是因为旧事务持有锁而创建了新事务吗?对此有什么想法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-13 16:27:15

看起来像某种死锁,两个事务,外部(来自A)和内部(来自B)有一个锁/尝试锁定相同的资源。

票数 6
EN

Stack Overflow用户

发布于 2021-09-26 17:02:26

我也有同样的问题,这是我的解决方案:

因为我不想立即执行方法B(),所以我使用了来自org.springframework.scheduling.annotation的注释@Async和函数B()来使其在单独的线程中执行。

PS:我的代码中没有value=Constants.READ_WRITE _REQUEST

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8847377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档