Требуется транзакция для набора запросов на чтение (грязное чтение)
Я полагаю, у вас высокий уровень одновременного чтения незафиксированных данных. Это, вероятно, единственный вариант использования транзакции в запросах Select. Я предполагаю, что они все еще связаны с несколькими операциями DML
С чего начать Транзакция, BL / DAL, нужен ли ей DbContext?
Это зависит от вашего варианта использования, если ваш дизайн таков, что несколько бизнес-запросов, которые должны быть частью транзакции, отправляются из BL, то это допустимая отправная точка, особенно с использованием транзакции Ambient (TransactionScope). Явный Session
или Context
для инициирования Транзакции является одним из механизмов, так как все общие запросы беспрепятственно зачисляются в один и тот же Контекст транзакции, но аналогичная вещь возможна при использовании TransactionScope
или CommittableTransaction
, вы можете использовать TransactionScopeOption
для обеспечения участия в различных запросах:
- Использование
Requires New
для инициирования внешней транзакции на BL и на уровне DAL с использованием Required
для обеспечения того же контекста транзакции, используемого для включения в список. Соединение с базой данных будет автоматически зачислено в доступную область.
- Используя
CommittableTransaction
, тот же объект, созданный в BL, передается в хранилища DAL, и там объекты Connection явно включаются в список
- Если ваше требование является немного более конкретным, когда No Commit выполнима до тех пор, пока все операции Child в отдельных потоках не будут завершены, просмотрите DependantTransaction , которая также является частью System.Transaction, но она выполняет гораздо более жесткую привязку, в основном для многопоточного сценария, она может вам не понадобиться для вызовов Async Await, поскольку вы завершаете ее только после завершения всех
awaits
.
Проблема, связанная с TransactionScope, должна быть размещена в том же потоке, в котором она была создана.
Решение - здесь , это было введено в .Net4.5.1 и обеспечивает использование TransactionScope
для асинхронных вызовов
Уровень изоляции сервера SQL для запросов
То, что вы имеете в виду, является значением по умолчанию для большинства систем ReadCommitted
, но вы, безусловно, можете настроить параметры для обеспечения более низкого IsolationLevel, хотя также будьте готовы к последствиям чтения грязных данных в приложениях