2016-11-24 2 views
2

Я создаю веб-API, на котором я применяю некоторые настраиваемые механизмы безопасности. Чтобы проверить, разрешена ли операция, мне нужно сохранить изменения в базе данных в транзакции и выполнить фиксацию или откат после.Предотвратить SELECT в базе данных во время транзакции

Вот упрощенная версия того, что я делаю:

public IHttpActionResult Post(Account account) 
{ 
    using (DbContextTransaction transaction = Context.Database.BeginTransaction()) 
    { 
     Context.accounts.Add(account); 

     Context.SaveChanges(); 

     // This will do one or several SELECTs on the database to do the verification 
     RollbackIfForbidden(transaction, account); 

     transaction.Commit(); 
    } 

    return Ok(); 
} 

Что мне нужно, чтобы установить IsolationLevel на моей транзакции, которая блокирует таблицу (или базу данных), пока транзакция не будет зафиксирована или rollbacked. Эта блокировка должна задерживать любой запрос, выполняемый в базе данных, когда он заблокирован. кроме для тех, которые отправляются методом RollbackIfForbidden.

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

Edit:

рассказ пользователя

  1. Пользователь отправляет POST запрос, чтобы создать объект учетной записи.
  2. Служба начинает транзакцию и хранит учетную запись в базе данных.
  3. База данных может вносить некоторые изменения в сущность (через триггеры или ограничения).
  4. Служба запрашивает новую учетную запись с изменениями, внесенными в базу данных.
  5. Служба проверяет, имеет ли текущий пользователь право на создание этой конкретной учетной записи (на основе значения, которое пользователь заполнил и что база данных была заполнена)
  6. Служба выполняет фиксацию, если пользователь разрешен или выполняет если он запрещен.
  7. Служба возвращает статус операции (успех или ошибка).

Моя проблема заключается в том, что между шагами 2 и 6, другой пользователь может сделать запрос к базе данных и получить созданную учетную запись в то время как он может быть удален в шаге 6. Поэтому мне нужно заблокировать базу данных в тем не менее, но мне также нужно запросить базу данных на шаге 4, чтобы получить новые значения моего объекта.

+0

'метод SaveChanges' построившего в транзакции, не так ли? –

+0

@LeiYang Мне нужно использовать определенную транзакцию, потому что я хочу иметь возможность делать откаты в случае ошибки. Если метод 'SaveChanges' имеет встроенную транзакцию, для меня бесполезно, если я не могу получить к нему доступ. Но мой вопрос больше связан с блокировкой базы данных во время моей транзакции. – Vyrira

+0

вы можете дать нам ** историю пользователя ** зачем нужна такая транзакция? –

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^