gpt4 book ai didi

java - 当必须执行步骤 2 时,处理步骤 1 中异常的最佳方法是什么

转载 作者:行者123 更新时间:2023-11-30 10:11:27 25 4
gpt4 key购买 nike

在我们的应用程序情况下,用户已请求更新帐户的 2 个字段,例如 (A, B)。一个帐户有多个商店,更新字段要推送到这些商店。其中一家商店被标记为默认商店。字段 A 需要对默认商店进行一些验证(比如数量限制)。

If validation fails I am throwing exception. On success field value is added to store_space_table

字段 B 必须推送到所有商店。当商店关闭或无法访问时,推送到商店可能会引发异常。目前我已经在 finally block 中编写了这段代码。

我不想在第二步的异常上回滚第一个操作。相反,我想合并步骤 1 和步骤 2 的异常并传播它。

void validateFieldAndPushToStore(List<Field> inputFieldList, Account account) throws ServiceException {

List<Store> allStoresOfAccount = getAllStoresOfAccount(account);
Set<Store> storeListToPushData = new HashSet<>();

try{
if(ifFieldAUpdated(inputFieldList)) {
// get default store from list of stores of an account,
Store defaultStore = getDefaultStore(allStoresOfAccount)

// Validate space availability of A on default store, if validation is successful, then update data in store_space_table
validateSpaceOnDefaultStoreForFieldA(defaultStore);

storeListToPushData.add(defaultStore);
}
} finally {
if( ifFieldBUpdated(inputFieldList) ) {
storeListToPushData.addAll(allStoresOfAccount);
}

if( ! storeListToPushData.isEmpty()) {
// This operation reads fields A from DB (store_space_table), reads field B from field_tbl and push to stores.
pushUpdatesToStores(account, storeListToPushData);
}
}
}

正如我在多个论坛上看到的那样,finally 中的这种处理不正确/效率不高。所以我正在寻找替代或更好的方法来处理这种情况。

最佳答案

这两个更新应该包含在一个事务中。

@Transaction 简而言之。

您的服务结构应如下所示。

@Transactional
public void validateFieldAndPushToStore(A a, B b) {

serviceA.validateAndPushA(a);
serviceB.validateAndPushB(b);

}

serviceA 和 serviceB 的实现所在的位置。

@Transactional
public void validateAndPushA(A a){
validate(a); // can throw validation exception from here
persist(a); // can throw persistence exception from here
}

@Transactional
public void validateAndPushB(B b){
validate(b); // can throw validation exception from here
persist(b); // can throw persistence exception from here
}

请注意 validateAndPushAvalidateAndPushB 顶部的 @Transactionalpersist 方法也应使用 @Transactional 进行注释。

如果您以这种方式构建代码,如果发生任何验证或持久性异常,所有数据库更改都将回滚。发生这种情况是因为 @Transactional 有一个名为 propagationLevel 的属性,如果保留默认值,它将执行任何内部事务(例如 persist 操作)在单个外部事务中(即 validateAndPushAvalidateAndPushBvalidatepersist 都将在同一事务 - 因此这些方法抛出的任何异常都将导致整个事务被回滚)。

@Transactional 允许进行大量微调,例如对于哪些异常不应回滚事务。有关所有详细信息,请查阅文档。

希望这对您有所帮助!

关于java - 当必须执行步骤 2 时,处理步骤 1 中异常的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52437934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com