2016-08-18 32 views
0

我有做一些工作服務:Spring的事務中 - 新需要 - 回滾父

@Service 
@Transactional 
public class FooServiceImpl implements FooService { 

    @Override 
    public void invoke() { 
     process(); 
    } 

    public void process() { 

    // possible that will throw exception 
    elements.forEach -> processOne(..) 

    } 

    @Transactional(propagation = Propagation.REQUIRES_NEW) 
    public void processOne(..) { 

    // possible that will throw exception 

    } 

}

invoke()方法是從另一個組件調用。據我所知這種方法是在交易中運行(如果存在 - 繼續,如果沒有 - 創建一個新的)。但我所期望的 - 方法processOne(..)正在運行新的交易 - 所以如果在這一個一切都沒問題,交易應該提交。但是如果發生錯誤,那麼整個過程就會回滾。不僅從當前的交易。怎麼了 ?

回答

1

僅當從其他類直接調用processOne方法調用時,它纔會在同一個類中調用它時創建新的事務。

另請參閱this question和我的答案。

spring reference manual

在代理模式(這是默認值),只有外部方法調用通過代理來在被截獲。這意味着即使被調用的方法標記爲@Transactional,實際上,自調用目標對象內的方法調用目標對象的另一個方法也不會導致實際的事務處理。此外,代理必須完全初始化以提供預期行爲,因此您不應該在初始化代碼中依賴此功能,即@PostConstruct。