Вложенные транзакции с 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);

будет ли внутренний TransactionScope scope2 также откатываться?

2 ответов


да.

внутренняя транзакция регистрируется в той же области внешнего, и все это будет откат. Это так, поскольку вы не зарегистрировали внутреннюю транзакцию как новую, используя TransactionScopeOption.RequiresNew.


см. здесь для объяснения по этому вопросу: http://web.archive.org/web/20091012162649/http://www.pluralsight.com/community/blogs/jimjohn/archive/2005/06/18/11451.aspx.

кроме того, обратите внимание, что scope1.Dispose является избыточным, так как scope1 будет автоматически размещен в конце using блок, который заявляет она.