2012-10-31 109 views
1

我有一個下面的場景,我想了解Spring中的嵌套事務處理以及傳播。其實我對此已經有了足夠的瞭解,但仍然不清楚一些事實。Spring嵌套事務​​處理和嵌套傳播

public class ServiceImpl { 
@Autowired 
public AnotherService anotherService; 

@Transactional // by default it is PROPOGATION_REQUIRED 
public void insert(){ 
    anotherService.anotherInsert(); 
} 
} 

public class AnotherServiceImpl { 

@Transactional(propagation = Propagation.NESTED) 
public void anotherInsert() { 
    insertSomeTestData(); 
} 

private void insertSomeTestData() { 
    // call insert some test data recursively 
    // insert trasaction 
    insertSomeTestData(); 
} 
} 

在這種情況下,anotherInsert會犯一些數據嵌套數據和rollsback,會因此受到影響外部事務默認情況下是PROPOGATION_REQUIRED還不清楚的一點仍然是什麼。如果交易被嵌套時,將他們在這種情況下開始新的?

回答

1

下面是說明嵌套

「嵌套事務中執行,如果當前事務存在,或者它會像PROPAGATION_REQUIRED其他」

在提到的情況下,因爲有存在一個當前事務它會在嵌套事務下繼續執行,不會創建新的事務。

糾正我,如果我錯了。謝謝

+0

「AnotherService.anotherInsert」調用將創建一個嵌套事務,因爲ServiceImpl.insert中已存在的事務已存在。 – Donatello

0

「AnotherService.anotherInsert」調用將創建一個嵌套的邏輯事務,在ServiceImpl.insert中已有的事務之下。

回滾嵌套事務不會回滾主節點,如REQUIRES_NEW行爲。

規格:

PROPAGATION_NESTED使用一個單一的實物交易與多個 保存點,它可以回滾到。這種部分回滾允許內部事務處理作用域觸發其作用域的回滾,其中外部事務能夠繼續物理事務 ,儘管某些操作已被回滾。此設置通常映射到JDBC保存點上,因此只能與JDBC 資源事務一起使用。請參閱Spring的DataSourceTransactionManager。

但是,你應該知道,基於JDBC的保存點使用單一的實物交易的嵌套事務是。這意味着你必須使用JDBC數據源和下面的事務管理器,使它的工作原理:

org.springframework.jdbc.datasource.DataSourceTransactionManager

參看http://docs.spring.io/spring/docs/current/spring-framework-reference/html/transaction.html#tx-propagation-nested