2011-06-22 107 views
8

我想了解使用傳播支持春季交易。 Java文檔提到,如果從事務內調用了具有@Transactional(propagation = Propagation.SUPPORTS)的方法,它支持該事務,但如果不存在事務,則該方法以非事務方式執行。春季交易與支持傳播

不管Propagation.SUPPORTS是不是已經是春季交易的行爲了?

 


public class ServiceBean { 

    @Transactional(propagation = Propagation.SUPPORTS) 
    public void methodWithSupportsTx() { 
     //perform some database operations 
    } 
} 

public class OtherServiceBean { 

    @Transactional(propagation = Propagation.REQUIRED) 
    public void methodWithRequiredTx() { 
     //perform some database operations 
     serviceBean.methodWithSupportsTx(); 
    } 
} 

 

在上面的代碼示例,而不論methodWithSupportsTx()是否具有@Transactional(propagation = Propagation.SUPPORTS)註釋,將在根據methodWithRequiredTx()是否具有@Transactional註釋,權利事務被執行?

那麼有什麼需要/使用傳播級別SUPPORTS?

回答

0

如果不存在,則必需的事務將創建新的事務。因此,當您調用serviceBean.methodWithSupportsTx()時將會發生新的事務。如果你的方法是真正的事務處理,如果沒有事務存在,你將會看到Spring發生錯誤。

+0

我不這麼認爲。僅當傳播級別從不出現時才拋出錯誤。另外,PROPAGATION.SUPPORTS不會創建新的事務。 –

4

javadoc

注:對於事務管理與交易同步,PROPAGATION_SUPPORTS是無成交略有不同所有的,因爲它定義了一個事務範圍同步將申請。因此,相同的資源(JDBC連接,Hibernate會話等)將爲整個指定範圍共享。請注意,這取決於事務管理器的實際同步配置。

因此,這意味着,例如,在methodWithSupportsTx()內的Hibernate的SessionFactory.getCurrentSession()的多次調用將返回相同的會話。

+0

假設methodWithSupportsTx()沒有@Transactional註釋,你是否試圖說在事務中調用methodWithSupportsTx()時不會返回同一會話? –

+0

@Amit:實際上,沒有'@ Transactional'試圖通過'HibernateTransactionManager'的典型配置調用'getCurrentSession()'會產生一個「沒有Hibernate Session綁定到線程,並且配置不允許在這裏創建非事務性的Session」例外。 – axtavt

+0

不,我的意思是,如果methodWithSupportsTx()方法中沒有@Transactional註釋,並且此方法是從另一個已經在事務中的方法中調用的,那麼在Hibernate的SessionFactory.getCurrentSession的多個調用中不會返回相同的會話()。這正是我在上面的問題中陳述的例子 - methodWithRequiredTx()上的@Transactional註釋創建一個新的事務,然後調用serviceBean.methodWithSupportsTx(),因此由methodWithSupportsTx()執行的代碼已經在事務中了,對吧? –