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

Spring事务中需要传播

东方智敏
2023-03-14

在下面的文章中说,

在此处输入链接描述

需要传播–支持当前交易;如果不存在,请创建一个新的。

下面是一个产品代码,然后是两个表的产品详细信息。

public void save(Product product, int qoh){

        productDao.save(product);
        System.out.println("Product Inserted");

        ProductQoh productQoh = new ProductQoh();
        productQoh.setProductId(product.getProductId());
        productQoh.setQty(qoh);

        productQohBo.save(productQoh);
        System.out.println("ProductQoh Inserted");
    }

我的问题是什么时候会发生这种行为?我的意思是,当前交易怎么会结束?是在保存还是更新之后?

如果我们使用PROPAGATION_REQUIRED假设当前事务在插入产品后结束。然后一个新的事务来了,但是如果插入产品数量时出现任何故障,它只会回滚数量而不是输入的产品详细信息知道吗?所以仍然数据不一致。

共有2个答案

何海
2023-03-14

这取决于您在哪里应用了事务声明性规则。

我假设提供的示例来自Service层。如果是这样,将事务声明应用于服务层以保持完整性将是明智的。

谭池暝
2023-03-14

在您的示例中,如果抛出异常(因为输入了不正确的数据),整个方法将回滚,使您没有插入任何内容。这是假设您已经注释了保存方法@Transactional。如果您注释了DAO方法@Transactional,那么您将得到一些正在插入的对象和一些没有插入的对象。最好将注释保留在Service层,这样您就知道您的数据库不会被部分故障弄脏。

TL;DR:要么所有内容都保存到数据库,要么什么都不保存到数据库。

 类似资料:
  • 在以下代码方法中,更新正确的sql,但sql有一些问题,但是,当我调用doService()时,它必须将更新提交到DB,即使doService 2()有sql异常,因为doService 2()有一个新的传播类型,但是当我取消这个更新时,不会提交DB。。 正如你们的建议,以以下方式进行测试,但仍然面临相同的问题。这里i在一个单独的类中,但即使仍然存在与上述相同的问题

  • 对于每个客户机,我们自然需要发送关于事务的反馈(OK或Exception->rollback)。 我的问题是:如果我使用,是否意味着只使用一个事务,如果第100个客户机遇到问题,第1个客户机的事务也会回滚?

  • 我在存储库类中有一个方法,标记为,该方面正在执行,如stacktrace中所示,但抛出的异常是“Transaction required exception” 电磁场: 交易: 我真的要疯了,任何帮助都会很好。 似乎,有一个事务,它被检查为完成,加入事务失败,所以它标记为仅回滚,因为它不能加入它。

  • 我试图弄清楚如何配置一个方法,使其不在使用Spring的事务中运行。我读到Spring数据存储库默认情况下激活其方法中的事务行为。我不想要这个事务,因为我有许多对存储库的“保存”调用,并且每个调用都是独立的。我认为为每个对存储库方法的调用创建一个事务会降低代码和应用程序的性能。所以: 这是可能的还是每个服务或dao方法都必须在一个事务中运行? 如果有,为什么? 如果可能,如何配置方法不在事务中运行

  • 我试图理解Spring事务概念。如下所示,我必须将数据插入两个不同的数据库(iSeries和DB2),但我们的iSeries版本不支持两阶段提交。要求是,只有当两个插入都成功时才应该提交事务,否则应该回滚。 如果我根据需要使用传播或REQUIRES\u NEW,我会得到错误“非法尝试使用现有的两阶段资源提交一阶段资源”。 但是如果我使用NOT_SUPPORTED或支持,它工作正常(即如果其中一个插

  • 所称的刀是: 我希望服务类中的方法在事务中运行,并在方法出现异常时回滚所有内容。但这不是在事务中运行的。 如果我将添加到DAO方法中,那么它看起来就像是在单独的事务中运行的。这是正确的吗?