当前位置: 首页 > 面试题库 >

如何在多线程中使用Spring事务

谷弘致
2023-03-14
问题内容

我有如下方法:

ClassA.java
@Transactional
public void methodA(){        
    ExecutorService executorService = Executors.newFixedThreadPool(4);
    executorService.execute(new Runnable() {
        public void run() {
            classB.methodB();
        }
});
}
ClassB.java
@Transactional
public void methodB(){
    updateDB();
}

methodB可以正常工作吗?根据我的理解,methodB将附加methodA的事务,如果methodA在methodB之前退出该怎么办?我想事务只能提交methodA。但是methodB将不会提交,因为该事务之前已提交。

我可以对方法B使用@Transactional(propagation =
Propagation.REQUIRES_NEW)。这可以使methodB进行新的事务。但是根据spring
doc,调用methodB时methodA的事务将暂停。我在这里感到很困惑。

谁能帮我解决这个问题?提前致谢。


问题答案:

不,methodB()将不会与在同一事务中执行methodA()。Spring @Transactional只能在单个线程上工作-
当线程首先使用时@Transactional(或类中的方法使用@Transactional)输入方法,然后在离开该方法时提交它,它将创建一个会话。

在您的示例中,事务将在您在线程池中计划作业后结束。methodB()将拥有自己的交易。



 类似资料:
  • 我正在使用Spring AMQP(RabbitMQ实现),我试图将单个事务传播到多个线程中。 例如,假设有3个队列,名称为X、Y、Z,首先我使用thread-1从队列X获取一条消息,然后,该消息被提供给thread-0,thread-0中的消息被克隆并通过thread-3发送到队列Y、thread-2和队列Z。线程0等待线程3和线程4的完成,以提交或回滚消息。注意,这里我使用了4个线程。 我想要的

  • 问题内容: 有人可以帮助我了解什么是Java 以及何时使用它吗? 对于该程序的工作方式,我没有一个很清楚的想法。据我了解,所有三个线程同时启动,每个线程将在3000ms之后调用CountDownLatch。因此,递减计数将逐一递减。锁存器变为零后,程序将打印“ Completed”。也许我的理解方式不正确。 // ------------------------------------------

  • Spring Transaction不支持多线程,所以我尝试在thread的run()方法中手动管理事务。但是,没用! 我想在下面的示例中回滚每个线程的run()方法,当其中有异常抛出时。(在以下情况下,插入到UNKNOWN_TABLE) 我的预期结果是“开始,1,3,5,结束”。 而实际结果是‘开始,1,2,3,4,5,结束’。 欢迎任何回复!谢谢! 主要类别: 服务等级:

  • 问题内容: 我已经成功设置了Spring Batch项目教程。我真的很想知道是否有可能在“ Spring级别”使它成为多线程的。 我想要的基本思想是列出任务或任务步骤的列表,并让它们由独立的线程拾取和处理,理想情况下是从限制为“ n”个线程的池中进行。 这可能吗?如果是这样,怎么办?有人可以引导我到我目前所在的位置吗? 简单的项目我是从本教程在这里。它基本上具有不同的任务,这些任务将消息打印到屏幕

  • 问题内容: 我正在尝试将Hibernate用于多线程应用程序,其中每个线程都检索一个对象并将其插入表中。我的代码如下所示。我每个线程都有本地hibernate会话对象,在每个InsertData中,我都执行beginTransaction和commit。 我面临的问题是很多次我收到“ org.hibernate.TransactionException:不支持嵌套事务” 由于我是hibernate

  • 问题内容: 是否有一种实际的方法可以在PHP中实现多线程模型,无论是真正的还是仅对其进行仿真。一段时间以前,建议您可以强制操作系统加载PHP可执行文件的另一个实例并处理其他同时进行的进程。 这样做的问题是,当PHP代码完成执行PHP实例后,它仍保留在内存中,因为无法从PHP中杀死它。因此,如果您正在模拟多个线程,则可以想象会发生什么。因此,我仍在寻找一种可以在PHP中有效完成或模拟多线程的方法。有