Возможно ли сбой транзакции dbcontext EF Core после успешного сохранения? - PullRequest
1 голос
/ 28 марта 2020

У меня есть транзакция, в которой я хочу сохранить в SQL Сервер базы данных некоторые данные, а затем выполнить некоторые действия, которые я не могу повторить, такие как отправка электронной почты, опубликовать sh сообщение ... et c.

И мне интересно, может ли транзакция EF Core с SQL провайдером сервера провалить событие, если контекст успешно сохранил данные (это может быть один или несколько вызовов SaveChanges)

using (var tran = _context.Database.BeginTransaction())
{
    try
    {
        Behaviour behaviour = new Behaviour(request.Kind, request.Label, request.Verb, request.Units, request.Cycles);
        _context.BehaviourSet.Add(behaviour);

        // A- other code here that adds entities to the context 

        // B- Save everything...
        await _context.SaveChangesAsync(cancellationToken);

        // C- Create and publish events to a store or some other non-transactional actions

        // D- I wonder if this transaction can fail even if the SaveChanges is successful
        tran.Commit(); 
    }
    catch (Exception e)
    {
        tran.Rollback();
        // E- logging and other stuff
    }
}

Ответы [ 2 ]

3 голосов
/ 28 марта 2020

Несмотря на то, что подключение к сети может быть прервано или сервер SQL Server может выполнить sh в любой момент, вы можете использовать этот шаблон с небольшой осторожностью. Просто уменьшите вероятность того, что это произойдет ниже определенного порога, и составьте оперативный план на случай непредвиденных обстоятельств. В конце концов, ни одна система не является надежной на 100%.

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

Во-вторых, дон не использовать таблицы InMemory. У них есть специальная оптимистическая модель параллелизма c, в которой конфликты записи / записи проверяются при фиксации. Это единственный сценарий, когда SQL Сервер применяет ограничения на фиксацию, а не при выполнении операции.

В-третьих, убедитесь, что на SQL Сервере достаточно места для файла журнала, поскольку он исчерпан пространство журнала может привести к невозможности фиксации (для этого требуется запись в журнал).

В-четвертых, имеется операционная процедура для обработки редкого случая неудачной фиксации.

0 голосов
/ 28 марта 2020

Да, это возможно.

  • Без транзакции любые SaveChanges являются собственной транзакцией. Таким образом, после сохранения изменений транзакция была подтверждена.

  • При активной передаче одно изменение сохранения ничего не фиксирует, поэтому следующее может вызвать исключение, вызывая откат вся сделка Если транзакция имеет ТОЛЬКО одну смену, передача может ВСЕ ЕЩЕ потерпеть неудачу, потому что фиксация и сохранения не происходят сразу после друг друга. Для вас это может показаться незамедлительным, но для компьютеров достаточно времени, и это возможно, т. Е. У компьютера произошел сбой ПРЯМО в момент между двумя линиями. В результате транзакция не будет зафиксирована, и вы получите исключение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...