TransactionScope на бизнес-уровне для грязного асинхронного чтения - PullRequest
0 голосов
/ 03 сентября 2018

Я занимаюсь разработкой веб-API .NET Core, и у меня следующий метод в BL:

public async Task<SetParams> GetParams(CreateRequest request)
        {
            var user = await _userRepository.GetUserByLogin(request.Login);  
            var client = await _clientRepository.GetClientByCode( request.ClientCode);

            // many other getters here 

            return new SetParams
            {
                IdUser = user.IdUser,
                ClientName = client.Name,
                // and so forth...
            };
        }

У меня есть требование перевести все объекты в режим «грязного чтения».

Итак, я пытался использовать TransactionScope следующим образом:

public async Task<SetParams> GetParams(CreateRequest request)
        {
            using (var ts = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
            {
                var user = await _userRepository.GetUserByLogin(request.Login);
                var client = await _clientRepository.GetClientByCode(request.ClientCode);

                // many other getters here 

                ts.Complete();

                return new SetParams
                {
                    IdUser = user.IdUser,
                    ClientName = client.Name,
                    // and so forth...
                };
            }
        }

Но: 1) это прочитало режим фиксации (из этого поста я знаю, что мне нужно начать транзакцию, но у меня нет сеанса или контекста БД здесь, потому что я в BL не в DAL)

и 2) заканчивая исключением TransactionScope должен располагаться в том же потоке, в котором он был создан.

1 Ответ

0 голосов
/ 03 сентября 2018

Требуется транзакция для набора запросов на чтение (грязное чтение)

Я полагаю, у вас высокий уровень одновременного чтения незафиксированных данных. Это, вероятно, единственный вариант использования транзакции в запросах Select. Я предполагаю, что они все еще связаны с несколькими операциями DML

С чего начать Транзакция, BL / DAL, нужен ли ей DbContext?

Это зависит от вашего варианта использования, если ваш дизайн таков, что несколько бизнес-запросов, которые должны быть частью транзакции, отправляются из BL, то это допустимая отправная точка, особенно с использованием транзакции Ambient (TransactionScope). Явный Session или Context для инициирования Транзакции является одним из механизмов, так как все общие запросы беспрепятственно зачисляются в один и тот же Контекст транзакции, но аналогичная вещь возможна при использовании TransactionScope или CommittableTransaction, вы можете использовать TransactionScopeOption для обеспечения участия в различных запросах:

  1. Использование Requires New для инициирования внешней транзакции на BL и на уровне DAL с использованием Required для обеспечения того же контекста транзакции, используемого для включения в список. Соединение с базой данных будет автоматически зачислено в доступную область.
  2. Используя CommittableTransaction, тот же объект, созданный в BL, передается в хранилища DAL, и там объекты Connection явно включаются в список
  3. Если ваше требование является немного более конкретным, когда No Commit выполнима до тех пор, пока все операции Child в отдельных потоках не будут завершены, просмотрите DependantTransaction , которая также является частью System.Transaction, но она выполняет гораздо более жесткую привязку, в основном для многопоточного сценария, она может вам не понадобиться для вызовов Async Await, поскольку вы завершаете ее только после завершения всех awaits.

Проблема, связанная с TransactionScope, должна быть размещена в том же потоке, в котором она была создана.

Решение - здесь , это было введено в .Net4.5.1 и обеспечивает использование TransactionScope для асинхронных вызовов

Уровень изоляции сервера SQL для запросов

То, что вы имеете в виду, является значением по умолчанию для большинства систем ReadCommitted, но вы, безусловно, можете настроить параметры для обеспечения более низкого IsolationLevel, хотя также будьте готовы к последствиям чтения грязных данных в приложениях

...