2013-07-26 4 views
0

Я читал, что уровень изоляции по умолчанию для ADO.NET (когда транзакции не используются, т. Е. Каждая инструкция выполняется как атомная операция) является «READ COMMITTED» и изоляция по умолчанию уровень для TransactionScope (http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx) является «SERIALIZABLE». Для этого есть причина?Уровень изоляции ADO.NET v Уровень изоляции транзакцииScope

Я прочитал много веб-страниц на эту тему, но я еще не нашел ответа на свой конкретный вопрос.

ответ

0

A Сделка - это единица работы, которая в основном означает, что в сфере действия выполняется несколько действий. Например, Бронирование корзины включает в себя проверку продукта, проверку количества на руке, расчет стоимости доставки и обновление финансовой отчетности. Все эти действия должны идти как один или ни один, если какой-либо из них имел фантомное чтение, как в случае уровня изоляции «READ COMMITTED», тогда он помещает данные в состояние устаревания. Если используется «SERIALIZED», то это предотвратит любые обновления для объектов, участвующих во время транзакции.

В случае, когда вы смотрите на финансовые отчеты за месяц, потом «READ COMMITTED» Изоляционные работы на уровне, потому что вы смотрите на существующие данные и не делать слишком много изменений, даже фантом читает не будет создайте большую разницу в отчетах.

+0

Спасибо, но я не верю, что это отвечает на мой вопрос. Я понимаю разницу между двумя типами изоляции, о которых идет речь. Я блуждаю, почему TransactionScope по умолчанию отличается от уровня изоляции по сравнению с SQL Server. – w0051977

+0

Ну, любые решения RDBMS по умолчанию поддерживают свойства ACID. По умолчанию, без области транзакции, он будет ЗАВЕРШЕН. Надеюсь, я ответил на ваш вопрос. – Phani

+0

Знаете ли вы, есть ли причина, по которой уровень изоляции сериализуется с помощью транзакции? Я подозреваю, что это просто дизайнерское решение, сделанное разработчиком транзакций. – w0051977

0

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

Например, услуга, которая имеет 3 метода: контрольный баланс, повышение баланса & уменьшение баланса. Каждый метод запускает транзакцию, открывает соединения с базой данных, выполняет SQL, закрывает соединение и совершает транзакцию.

Типичный сценарий затем будет для клиента этой службы:

  1. начала мастер транзакции
  2. проверка баланса счета 1
  3. снижение сальдо счета 1
  4. увеличение сальдо счета 2
  5. commit master transaction

IsolationLevel.Serializable гарантирует, что все вызовы службы будут: а) начинаться с одних и тех же данных и б) никто другой не может изменять эти данные во время выполнения основной транзакции.

IsolationLevel.ReadCommitted может привести к тому, что остаток счета 1 будет ниже нуля, если кто-то еще уменьшит остаток с достаточной суммой и совершит транзакцию между проверкой и уменьшением.

Смежные вопросы