当前位置: 首页 > 知识库问答 >
问题:

将Spring Transaction与多个线程一起使用[重复]

澹台奇略
2023-03-14

这个问题我已经被问过很多次了,而且一直困扰着我。

我们有一个服务类,有3个DAO方法更新3个不同的表。这种设计使得对所有三个表的更新都应该是原子的。我有3个线程分别调用我的服务类,对于每个DAO方法更新,如何使用Spring事务或任何事务管理器将所有线程(操作)保持在单个事务下??有任何关于文档的想法或指针吗??谢谢

共有2个答案

韩麒
2023-03-14

这可以通过将事务保持在线程级别来实现。但是,u 需要在所有这些线程之间共享一个对象。此共享对象将跟踪所有这些线程的状态,并在其中任何一个线程失败时通知它们。如果此线程收到失败通知,它们本身可以引发异常,并且它们的事务将被回滚。

单个线程中的代码

    @Transactional(rollbackFor = Exception.class)
    public void saveData(Product product, ProductStatusObject productStatusObject) throws Exception {
        productDao.persist(product);
        if(product.getId() == 5) {
            productStatusObject.updateCounter(false);
        } else {
            productStatusObject.updateCounter(true);
        }
        if(!productStatusObject.getStatus()) {
            throw new Exception();
        }
    }

共享类中的代码

    private final int  totalThreads;

    private int executedThreads = 0;
    private Boolean finalStatus = true;
    
    public ProductStatusObject(int totalThreads) {
        this.totalThreads = totalThreads;
    }
    
    public synchronized void updateCounter(Boolean threadStatus) throws InterruptedException {
        executedThreads ++;
        if(!threadStatus) {
            this.finalStatus = false;
        }
        if(totalThreads == executedThreads) {
            notifyAll();
        } else {
            wait();
        }
        
    }
    
    public synchronized Boolean getStatus() {
        return finalStatus;
    }

这里的失败条件是,如果任何线程保存id为5的数据,所有线程都将回滚它们的代码。否则一切都会成功

淳于玺
2023-03-14

服务方法应该是开始交易的方法

服务方式

public class Service{
// define dao1,dao2,dao3
@Transactional
public someMethod(){
   dao1.someUpdate();
   dao2.someUpdate();
   dao3.someUpdate();
}
}

Dao1.class

 public class Dao1{

      @Transactional (propagation = Propagation.MANDATORY)
      public someUpdate(){

      }
    }

类似地,Dao2和Dao3

一些更新()将使用由Service.class的一些方法()启动的事务

 类似资料:
  • 面试问题 比如说,我们有一个在Employee表中有200万条记录的表,我们需要削减每个员工10%的工资(需要做一些处理),然后将其保存回collection。你怎样才能有效地做到这一点。 我问他,我们可以使用executor框架来创建多个线程,这些线程可以从表中获取值,然后我们可以处理并将其保存到列表中。 然后他问我,你将如何检查一个记录是否已经被处理,我不知道(如何做)。 甚至我也不确定我是否

  • 问题内容: 2 能否从2个不同的mongdb数据库服务器中检索数据? 问题答案: 更新资料 现在可以连接到远程/多个数据库: mongodb url 在哪里,例如(带有数据库名称) 目前,这样做有一个缺点:没有Oplog 旧答案 目前,这是不可能的。每个流星应用程序都绑定到一个数据库。 您可以通过几种方法解决此问题,但其价值可能会更复杂: 一种选择-使用单独的Meteor应用 在另一个流星应用程序

  • 我正在解决一个生产者/消费者问题,我想创建几个生产者和消费者(几个线程),我有一个问题,我如何才能正确地创建几个线程,使一个任务不由两个线程执行(每个线程执行一个不同的任务)。 代码:我试着做一个循环,就像下面这样: 输出:但它不起作用,因为线程相互重叠

  • 我已经学会了我可以使用参考文献来实现这一点。但是,当我将一个ref与几个TextInputs一起使用时,我只与最后一个TextInputs一起使用

  • 问题内容: 考虑以下代码段: 显然不知道可以将a馈送到需要的方法(实际上,它的文档说它在寻找 具有指定名称和形式参数完全相同的方法 )。 是否有一种直接的方法来像上面那样以反射方式查找方法,但是要考虑多态性,以便上述反射示例在查询参数时可以找到该方法? 问题答案: 该反射教程 建议使用样本进行查找

  • 问题内容: 我希望能够使用gnu octave编程多个线程,以便它将利用多个处理器。 我在Fedora 17 Linux上安装了GNU Octave,并执行了以下操作: 在我的计算机上安装了最新版本的octave 3.6.2。它的效果很好,但是当您将两个巨大的矩阵相乘时,它会使八度使用的一个CPU陷入瘫痪。如果矩阵乘法利用所有内核,那就太好了,因为在这种情况下,CPU显然是瓶颈。 倍频程能否充分利