亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Transactional 注釋在使用 try catch 的 for 循環中不起作用

Transactional 注釋在使用 try catch 的 for 循環中不起作用

慕哥9229398 2022-06-08 17:12:26
我的問題如下。偽代碼代碼如下:public Object rollBackTestMainMethod(List<Object> list) {  List<Object> responseList = new ArrayList<>();  for(Object item:list){    try{          Boolean isOperationSuccess = rollBackTestSubMethod(item);      if (isOperationSuccess==null || !isOperationSuccess){        item.addError("Operation failed");        item.addSuccess(false);      } else {        item.addError(null);        item.addSuccess(true);      }    } catch(Exception exception) {      item.addError(exception.getMessage());      item.addSuccess(false);    }    responseList.add(item);  }  return responseList;}@Transactional(rollbackFor = {Exception.class, SQLException.class})private Boolean rollBackTestSubMethod(Object listItem){  Long value1=save(listItem.getValue1());  if(value1==null){    throw new Exception("Error during save 1");  }我在這里做什么:在 中迭代一個列表rollBackTestMainMethod()。發送一個列表項rollBackTestSubMethod()并執行 3 保存操作。如果全部保存完成則返回真響應,否則拋出異常。中rollBackTestMainMethod(),在得到響應或異常后,在每個項目上添加錯誤或成功值。它將此項添加到名為 的新列表中responseList。在所有操作之后,它會將其作為響應發送回來。我的問題:從rollBackTestSubMethod()它拋出后不會回滾,因為它是從 try catch 塊調用的。如果我想強制回滾,TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();那么它將回滾所有項目以進行任何拋出/異常。在這里,我只想回滾投擲物品而不是所有物品。此方法在 Spring bean 中我正在通過spring data jpa將數據保存到我的關系數據庫中
查看完整描述

2 回答

?
MYYA

TA貢獻1868條經驗 獲得超4個贊

這是因為您正在@Transactional從同一個 bean 中調用方法。


@Transactional僅適用于在 spring 創建的代理上調用的方法。這意味著,當您創建一個@Service或其他 bean 時,從外部調用的方法將是事務性的。如果從 bean 中調用,什么都不會發生,因為它不通過代理對象。


最簡單的解決方案是將方法移至另一個@Service或 bean。如果你真的想將它保存在同一個組件中,那么你需要調用它,以便它被 spring AOP 包裝在代理中。你可以這樣做:


private YourClass self;


@Autowired

private ApplicationContext applicationContext;


@PostConstruct

public void postContruct(){

    self = applicationContext.getBean(YourClass.class);

}

然后調用方法self將導致打開事務。


查看完整回答
反對 回復 2022-06-08
?
慕仙森

TA貢獻1827條經驗 獲得超8個贊

標記非公共方法 @Transactional 既無用又具有誤導性,因為 Spring 沒有“看到”非公共方法,因此沒有為它們的正確調用做準備。Spring 也沒有為它調用的方法調用的方法做準備。

因此,標記私有方法,例如,@Transactional 只有在方法實際上被寫入@Transactional 時才會導致運行時錯誤或異常。


查看完整回答
反對 回復 2022-06-08
  • 2 回答
  • 0 關注
  • 260 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號