在事务期间阻止数据库上的SELECT

时间:2016-11-24 01:25:14

标签: c# sql-server entity-framework transactions

我正在构建一个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);内完成的任何查询,则可以防止人们获取错误数据。

修改

用户故事

  1. 用户发送POST查询以创建帐户实体。
  2. 服务开始交易并将帐户存储在数据库中。
  3. 数据库可以对实体应用一些修改(通过触发器或约束)。
  4. 服务使用数据库所做的更改查询新帐户。
  5. 服务检查当前用户是否有权创建此特定帐户(基于用户填写的值和数据库已完成的值)
  6. 如果允许用户,服务会执行提交,或者如果禁止用户则执行回滚。
  7. 服务返回操作的状态(成功或错误)。
  8. 我的问题是,在步骤2和步骤6之间,另一个用户可以对数据库进行查询并获取创建的帐户,而在步骤6中可以将其删除。 所以我需要在此期间锁定数据库,但我还需要在步骤4中查询数据库以获取我的实体的新值。

1 个答案:

答案 0 :(得分:0)

您可以使用sp_getapplock为sql server

中的事务设置锁定

https://msdn.microsoft.com/en-us/library/ms189823.aspx