Spring事务中的PROPAGATION_REQUIRED

时间:2014-05-08 05:14:08

标签: java spring transactions

在下面的文章中说,

enter link description here

PROPAGATION_REQUIRED - 支持当前交易;如果不存在,则创建一个新的。

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

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 个答案:

答案 0 :(得分:1)

在您的示例中,如果抛出异常(因为输入的数据不正确),整个方法将回滚,不会插入任何内容。这假设您已注释save方法@Transactional。如果您注释DAO方法@Transactional,那么您将会插入一些对象而不会插入一些对象。最好将注释保留在Service层,以便您知道您的数据库不会因部分失败而变脏。

TL; DR:所有内容都保存到数据库中,或者没有任何内容保存到数据库中。

答案 1 :(得分:0)

这取决于您应用交易声明规则的位置。

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