2009-12-04 18 views
6

Se avete somehting in questo modo:transazioni nidificate con TransactionScope

IBinaryAssetStructureRepository rep = new BinaryAssetStructureRepository(); 
var userDto = new UserDto { id = 3345 }; 
var dto = new BinaryAssetBranchNodeDto("name", userDto, userDto); 
using (var scope1 = new TransactionScope()) 
{ 
    using(var scope2 = new TransactionScope()) 
    { 
     //Persist to database 
     rep.CreateRoot(dto, 1, false); 
     scope2.Complete(); 
    } 
    scope1.Dispose(); 
} 
dto = rep.GetByKey(dto.id, -1, false); 

disposta la TransactionScope Scope2 interno anche essere rotolato indietro?

risposta

14

Sì.

La transazione interna è registrata nello stesso ambito di quella esterna e l'intera operazione verrà ripristinata. Questo è il caso, poiché non hai registrato la transazione interna come nuova utilizzando TransactionScopeOption.RequiresNew.

7

Vedere qui per una spiegazione su questo argomento: http://web.archive.org/web/20091012162649/http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/06/18/11451.aspx.

Inoltre, si noti che il scope1.Dispose è ridondante in quanto scope1 verranno disposti automaticamente alla fine del blocco using che dichiara.

+2

Questo link è rotto. – adamjford

+0

Si dice scope.Dispose è ridondante, ma soprattutto scope1.dispose restituisce la transazione. – Mcanic

Problemi correlati