Я создаю веб-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:
рассказ пользователя
- Пользователь отправляет POST запрос, чтобы создать объект учетной записи.
- Служба начинает транзакцию и хранит учетную запись в базе данных.
- База данных может вносить некоторые изменения в сущность (через триггеры или ограничения).
- Служба запрашивает новую учетную запись с изменениями, внесенными в базу данных.
- Служба проверяет, имеет ли текущий пользователь право на создание этой конкретной учетной записи (на основе значения, которое пользователь заполнил и что база данных была заполнена)
- Служба выполняет фиксацию, если пользователь разрешен или выполняет если он запрещен.
- Служба возвращает статус операции (успех или ошибка).
Моя проблема заключается в том, что между шагами 2 и 6, другой пользователь может сделать запрос к базе данных и получить созданную учетную запись в то время как он может быть удален в шаге 6. Поэтому мне нужно заблокировать базу данных в тем не менее, но мне также нужно запросить базу данных на шаге 4, чтобы получить новые значения моего объекта.
'метод SaveChanges' построившего в транзакции, не так ли? –
@LeiYang Мне нужно использовать определенную транзакцию, потому что я хочу иметь возможность делать откаты в случае ошибки. Если метод 'SaveChanges' имеет встроенную транзакцию, для меня бесполезно, если я не могу получить к нему доступ. Но мой вопрос больше связан с блокировкой базы данных во время моей транзакции. – Vyrira
вы можете дать нам ** историю пользователя ** зачем нужна такая транзакция? –