2012-05-20 37 views
3

在我們的java項目中,我們使用了帶有hibernate和spring的ORM。 我在刪除持久對象時遇到了問題。例如,這樣的方法通過IDS得到實體,然後將其刪除:Spring transaction propagation_required issue

@Transactional 
public void remove(List<Long> ids) { 
    SearchTemplate template = new SearchTemplate(); 
    template.addParameter("milestoneId",ids); 
    List <InvoiceQueue> items = this.findByCriteria(template); 
    ... 
    this.delete(items); 
} 

方法執行好,沒有任何異常,但實際上並沒有刪除數據庫中的項目。

將以下注釋添加到方法定義@Transactional(propagation = Propagation.REQUIRES_NEW)可解決問題。

任何人都可以解釋爲什麼它不適用於默認傳播類型PROPAGATION_REQUIRED。

在此先感謝。

環境的詳細信息:

hibernate.version 3.5.5決賽,spring.version 3.0.5.RELEASE

+6

周圍的交易可能有問題。如果您使用PROPAGATION_REQUIRED,則此方法使用當前事務。如果在運行此方法後當前事務中存在異常,則可能會回滾這些更改。 –

回答

2

真的只是隨聲@PeterBagyinszki在他的評論中說,但原因很可能是,發生刪除的事務由於其他部分拋出異常而回滾,並且在事務處理期間所做的所有更改都被取消。使用Propagation.REQUIRES_NEW,刪除在其自己的單獨嵌套事務中完成。嵌套事務(提交或回滾)的結果不會影響「外部」事務,反之亦然。

請檢查您的日誌以查看導致事務回滾的原因,請注意,即使類似簡單的SELECT查詢失敗,會導致事務回滾,除非您在@Transactional中明確聲明 - 註釋它不回滾某些例外情況。

相關問題