Вложенные транзакции с TransactionScope - PullRequest
7 голосов
/ 04 декабря 2009

Если у вас есть что-то вроде этого:

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);

Будет ли откатываться внутренняя область действия TransactionScope2?

Ответы [ 2 ]

15 голосов
/ 04 декабря 2009

Да.

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

7 голосов
/ 04 декабря 2009

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

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

...