Вложенные транзакции с 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
блок, который заявляет она.