在下面的文章中说,
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,假设当前交易在插入产品后结束。然后出现一个新的交易但是如果在插入产品数量时出现任何故障,它只会回滚数量而不是输入的产品详细信息吗?那么数据仍然是不一致的吗?
答案 0 :(得分:1)
在您的示例中,如果抛出异常(因为输入的数据不正确),整个方法将回滚,不会插入任何内容。这假设您已注释save
方法@Transactional
。如果您注释DAO方法@Transactional
,那么您将会插入一些对象而不会插入一些对象。最好将注释保留在Service
层,以便您知道您的数据库不会因部分失败而变脏。
TL; DR:所有内容都保存到数据库中,或者没有任何内容保存到数据库中。
答案 1 :(得分:0)
这取决于您应用交易声明规则的位置。
我认为提供的示例来自Service
图层。如果是这样,那么将事务声明应用于服务层以保持完整性是明智的。