Как ограничить TranscactionScope для данного DataBaseContext в C #? - PullRequest
1 голос
/ 01 апреля 2011

Я хотел бы быть на 100%, когда я использую такой шаблон

using (var scope = new TransactionScope())
{
    db1.Foo.InsertOnSubmit(new Foo()); // just an example
    db1.SubmitChanges();
    scope.Commit();
}

область транзакции будет ссылаться только на db1, а не на db2 (db1 и db2 являются объектами DataBaseContext). Так как же ограничить область видимости только db1?

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 01 апреля 2011

Сила TransactionScope заключается в том, что он автоматически перехватывает все, что находится внутри него, вниз по стеку вызовов (если нет другого TransactionScope с RequiresNew или Supress).Если это не то, что вам нужно, вы должны использовать другой механизм для обработки транзакций.

Один из способов - открыть SqlConnection и вызвать BeginTransaction, чтобы получить транзакцию, а затем использовать это соединение с БД при созданииконтекст данных.(Возможно, вам придется установить правильность транзакции в контексте данных, я не уверен).

В приведенном выше примере использование TransactionScope полностью избыточно.Существует только один вызов функции, который фактически изменяет базу данных: SubmitChanges, и он всегда создает свою собственную транзакцию, если она еще не существует.Причина в том, что когда вы выполняете несколько операций, SubmitChanges должен либо преуспеть в них всех, либо провалить все.Если вам нужна целостность транзакций только для одного вызова SubmitChanges для одного контекста данных, вы можете просто удалить TransactionScope.

0 голосов
/ 01 апреля 2011

Если вы используете:

using (var scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    db1.Foo.InsertOnSubmit(new Foo()); // just an example
    db1.SubmitChanges();
    scope.Commit();
}

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

0 голосов
/ 01 апреля 2011

Насколько я знаю, то, что вы ищете, это именно то, что вы написали, компилятор будет гарантировать, что транзакция будет завершена при фиксации.

...