我正在构建一个Web API,我在其上应用了一些自定义安全机制。为了检查操作是否被授权,我需要在事务中将其更改保存在数据库中,然后执行提交或回滚。
以下是我正在做的简化版本:
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
来锁定表(或数据库),直到事务被提交或回滚。对于通过方法RollbackIfForbidden
发送的 ,此锁定应延迟对数据库执行的任何查询。
如果他们在Context.SaveChanges();
和transaction.Commit();
之间查询数据库但仍接受RollbackIfForbidden(transaction, account);
内完成的任何查询,则可以防止人们获取错误数据。
修改
用户故事
我的问题是,在步骤2和步骤6之间,另一个用户可以对数据库进行查询并获取创建的帐户,而在步骤6中可以将其删除。 所以我需要在此期间锁定数据库,但我还需要在步骤4中查询数据库以获取我的实体的新值。
答案 0 :(得分:0)
您可以使用sp_getapplock为sql server
中的事务设置锁定