为什么Spring @Transactional停止从阻塞队列中获取元素?

时间:2019-07-06 10:57:00

标签: java spring concurrency transactions annotations

我正在使用BlockingQueue将元素从提供程序传递给使用者,并且工作正常。

要在发生异常时回滚数据库操作,我将注释@Transactional(rollbackFor = Exception.class)添加到提供程序函数。出乎意料的是,这阻止了使用者从队列中读取任何元素。

提供者总是可以成功地将元素放入队列,但是使用者永远不能从队列中取出元素。

删除@Transactional批注,或将元素放入@Transactional标记方法之外的队列中,均可解决此问题。

这是Java伪代码

blockingQueue = new BlockingQueue();
// consumer code
while (true) {
    // take a element
    blockingQueue.take();
}

// provider code
// after removing the annotation the consumer works fine
@Transactional(rollbackFor = Exception.class)
provideElement() {
    // put a element
    blockingQueue.put();
}

我通过将put方法移出@Transactional代码段来解决此问题。但是我仍然很好奇:为什么添加@Trasactional注释会阻止使用者从阻塞队列中获取元素?

0 个答案:

没有答案