TransactionScope поддерживает атомарное выполнение БД? - PullRequest
3 голосов
/ 22 июля 2011

В настоящее время я разрабатываю проект, в котором DAL реализуется в .Net с использованием ADO Entity Framework.

Структура БД не проста, и я хотел бы быть в состоянии обеспечить выполнение некоторых операций с БДявляются атомарными.

Я знаю, что вы можете сделать это, создав STORED PROCEDURE и используя DB TRANSACTION (как упомянуто в в этом сообщении ).(Я использую SQL Server)

Дело в том, что я хотел бы максимально сохранить логику на стороне программного обеспечения, и я подумывал об использовании .Net TransactionScope.Хотя я понимаю, что он работает хорошо с точки зрения программного обеспечения (ничего не передается в БД, пока не будет зафиксирован весь объем), я сомневаюсь, что он все еще обеспечивает атомарное выполнение БД.

Кто-нибудь знает об этом?

Точнее говоря, обычно код будет выглядеть следующим образом:

using (TransactionScope scope = new TransactionScope())
{
  /*
   * Do some opreations such as reads, write, insert, deletes
   */
   scope.Commit()
}

Я хотел бы убедиться, что все, что в скобках, выполняется "атомарно" (изоляция = SERIALIZABLE IУгадай).Под этим я подразумеваю, что я не хочу, чтобы состояние БД могло изменяться во время выполнения кода в области.

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

TransactionScope запускает обновления в транзакции (и, возможно, чтения также в зависимости от уровня изоляции транзакции)

Поставщики баз данных уже являются частью этой транзакции, поскольку они используются в области транзакции - поэтомуобласть действия транзакции - это, по сути, транзакция базы данных (и, возможно, больше, если в транзакцию вовлечено несколько баз данных / очередей сообщений / и т.д.)

РЕДАКТИРОВАТЬ: Entity Framework Details

Entity Framework использует метод BeginTransaction подключения основного провайдера.В случае SqlConnection он использует значение по умолчанию для SqlServer и, следовательно, будет использовать ReadCommitted

. Поэтому, если вы не используете область транзакции, по умолчанию будет использоваться Read Committed, а не Serializable

1 голос
/ 22 июля 2011

Транзакция всегда атомарная, независимо от того, запущена ли она в SQL, включена на клиенте (например, TransactionScope)

1 голос
/ 22 июля 2011

Что вы подразумеваете под «атомарным исполнением БД»?Существуют различные уровни изоляции транзакций.

При обращении к SQL Server .NET TransactionScope подключает транзакцию SQL Server, которая по умолчанию будет иметь уровень изоляции Serializable.

...