2014-05-14 28 views
0

在我的服務,我有方法:@Transaction如何在interceped方法

@Transactional 
public void doSomething(String dbName) { 

} 

這個方法是由我的攔截器攔截:

@Override 
public Object invoke(MethodInvocation invocation) throws Throwable { 
    // do something 
    return invocation.proceed(); 
} 

我的問題是什麼是交易。只是代碼在我的服務或在我的攔截器?

回答

0

這真的取決於。僅當您定義spring使用<tx:annotation-driven/>(如果您使用XML進行配置)並且攔截器使用Spring創建的bean時,使用@Transactional纔會打開事務。

如果您不使用spring bean,@Transactional註釋沒有任何意義,並且不會執行任何操作,因爲spring將創建它在其中管理事務的原始類的包裝器/代理。

您可以查看運行doSomething()的類的實例,並查看它是隻包含您的私有字段還是還包含其他事務數據。還要看看類的類型 - 如果它是事務性的,它將顯示一個名稱,表明這是一個包裝器,而不是你的原始類名。

交易本身只運行在doSomething()左右。這意味着當您輸入doSomething()時,將打開一個交易,並在doSomething()完成時結束。

這是除非invoke()調用也在交易。如果invoke()在一個事務中,`doSomething()將在相同的事務中運行,並且不會打開一個新的(意味着它們都失敗或一起成功)。

+0

如果'invoke'參與取決於方面的排序。如果它在TransactionInterceptor之前執行,那麼它不是事務性的,否則它會參與同一事務。 –

相關問題