gpt4 book ai didi

c# - 防止在事务期间对数据库进行 SELECT

转载 作者:太空宇宙 更新时间:2023-11-03 15:11:57 25 4
gpt4 key购买 nike

我正在构建一个 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. 服务返回操作的状态(成功或错误)。

我的问题是,在第 2 步和第 6 步之间,另一个用户可能会查询数据库并获取创建的帐户,而该帐户可能会在第 6 步中被删除。所以我需要同时锁定数据库,但我还需要在第 4 步中查询数据库以获取我的实体的新值。

最佳答案

您可以使用 sp_getapplock 为 sql server 中的事务设置锁定

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

关于c# - 防止在事务期间对数据库进行 SELECT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40776717/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com