Платформа сущностей и транзакция в приложении asp.net mvc - PullRequest
0 голосов
/ 28 сентября 2011

У меня есть вопрос об управлении транзакциями в приложении asp.net.

Например, у меня есть приложение для планирования отпусков.

Контроллер имеет форму для утверждения отпусков.

Одинпользователь - нажмите сохранить и подтвердить отпуск ---- сотрудник, который хочет отпуск - 1 день второй пользователь - нажмите сохранить и подтвердить отпуск и?

//pseudocode

    public void ApproveVacation(int vacationId)
    {
        //pull vacationdata from db
        var vacation = _dbContext.Vacations.FirstOrDefault(x => x.Id == vacationId);
        if (vacation != null && vacation.State != approved) //
        {
            using (TransactionScope scope = new TransactionScope())
            {
                vacation.state = approved;
                vacation.Employee.Days = -1;
                _dbContext.saveChanges();
                scope.complete();
            }
        }
    }

И вопрос прост, достаточно ли транзакции для этого сценария илиЯ должен использовать одну из техник конкуренции?

Спасибо

РЕДАКТИРОВАТЬ: Контекст создается один на запрос.

Ответы [ 2 ]

0 голосов
/ 28 сентября 2011

Транзакция обрабатывает атомарность операции, поэтому, если операция изменяет несколько записей в базе данных, это всегда приводит к согласованному состоянию, в котором все записи корректно модифицируются (если операция завершается успешно) или все изменения откатываются (если операция не выполняется).

Параллелизм обрабатывает возможное изменение одной и той же записи несколькими процессами / пользователями, поскольку оба могут загрузить исходную версию записи, но один может сохранить ее первым, поэтому, когда второй процесс пытается сохранить запись, он может незаметно переопределить предыдущие изменения.

Так что вы пытаетесь обработать в своем коде?

0 голосов
/ 28 сентября 2011

У вас уже есть неявная транзакция при вызове «SaveChanges», поэтому нет необходимости в области транзакции.

А также, если вы измените несколько элементов, вам нужно будет запустить TransactionScope перед извлечениемданные.

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