2014-02-28 29 views
0

我是新的春天,我正試圖學習如何使用它的事務上下文。如何通過@Transactional註釋來管理傳播和隔離

我有一個從文件讀取的服務,堅持少數實體bean

@Service 
public class MyServiceImpl{ 

@Autowired 
MyObjectService myObjectService; 


@Transactional(propagation = Propagation.REQUIRES_NEW) 
public void readFromFile() throws Exception { 
    //Do something 
    checkAndSave();  
} 


public void checkAndSave() throws Exception { 

    List<MyObject> objects = myObjectService.readAll(); 

    for(MyObject myObject : objects){ 

     boolean check1 = myObjectService.check1(); 

     if(check1){ 
      myObjectService.save(myObject); 
     } 

    } 

} 

}

@Service 
public class MyObjectServiceImpl implements MyObjectService{ 

    @Repository 
    MyObjectRepository myObjectRepository 


    @Transactional(readOnly=true) 
    public List<MyObject> readAll(){ 
     myObjectRepository.findAll() 
    } 

    @Transactional(readOnly=true) 
    public boolean check1(){ 

     //run a few select to check somethings 
    } 

}

我的問題是:

的方法checkAndSave將在交易中運行? checkAndSave方法將在readFromFile方法的同一事務中運行?

而且我注意到,如果我將@Transactional註釋放在readFromFile方法上,應用程序比沒有註解運行需要更長的時間。

爲什麼?

回答

0

爲什麼你在check1和readAll方法上有交易?你應該在修改數據庫時使用事務。

保存方法將在其自己的事務中運行,而不是與讀取方法相同。 它在事務中花費很長時間,因爲它在執行之前驗證所有內容。

+0

爲底層數據存儲提供應用這些優化的機會。但也許一起閱讀只有我也應該使用傳播屬性? – Skizzo

相關問題