Причина в том, что область транзакций может охватывать несколько (суб) транзакций, которые все координируются с координатором распределенной транзакции (MS-DTC). В большинстве случаев вы хотите быть уверенным, что все подрансферы работают с одними и теми же данными, даже если между ними произошла фиксация.
Например, услуга, которая имеет 3 метода: контрольный баланс, повышение баланса & уменьшение баланса. Каждый метод запускает транзакцию, открывает соединения с базой данных, выполняет SQL, закрывает соединение и совершает транзакцию.
Типичный сценарий затем будет для клиента этой службы:
- начала мастер транзакции
- проверка баланса счета 1
- снижение сальдо счета 1
- увеличение сальдо счета 2
- commit master transaction
IsolationLevel.Serializable гарантирует, что все вызовы службы будут: а) начинаться с одних и тех же данных и б) никто другой не может изменять эти данные во время выполнения основной транзакции.
IsolationLevel.ReadCommitted может привести к тому, что остаток счета 1 будет ниже нуля, если кто-то еще уменьшит остаток с достаточной суммой и совершит транзакцию между проверкой и уменьшением.
Спасибо, но я не верю, что это отвечает на мой вопрос. Я понимаю разницу между двумя типами изоляции, о которых идет речь. Я блуждаю, почему TransactionScope по умолчанию отличается от уровня изоляции по сравнению с SQL Server. – w0051977
Ну, любые решения RDBMS по умолчанию поддерживают свойства ACID. По умолчанию, без области транзакции, он будет ЗАВЕРШЕН. Надеюсь, я ответил на ваш вопрос. – Phani
Знаете ли вы, есть ли причина, по которой уровень изоляции сериализуется с помощью транзакции? Я подозреваю, что это просто дизайнерское решение, сделанное разработчиком транзакций. – w0051977