实体框架交易锁定

b

我在我的Web应用程序中看到一些奇怪的竞争状况,我怀疑这可能是由于Entity Framework以意外方式处理读取锁所致。当我的应用程序对任何页面提出请求时,我会自动加载帐户模型,然后在请求的整个生命周期中将其存储在DbContext中。一些网页需要锁定帐户数据库行,这样我就可以安全地进行其他一些操作而不会出现争用条件。这就是我现在正在做的事情...

//... code that begins the request and loads the account into context.
// Some pages may run code that looks something like this.
using(var tran = existingCtx.Database.BeginTransaction(IsolationLevel.RepeatableRead))
{
    // Lock customer.
    var act = ctx.Accounts.Find(purchaseFor.ID);
    if (act == null)
        throw new RecordNotFoundException("Unable to find specified customer.");

    DoStuffRelyingOnLock();
    Commit();
}

调用是否会找到Find(purchaseFor.ID)锁定数据库中的帐户行,即使该行已加载到上下文中也是如此?

斯坦

调用是否会找到Find(purchaseFor.ID)锁定数据库中的帐户行,即使该行已加载到上下文中也是如此?

不,不会。如果上下文已经加载了该实体,则它甚至不会与数据库对话。

请参阅有关该方法工作原理文档Find(重点是我的):

使用主键查找实体

上的Find方法DbSet使用主键值来尝试查找上下文跟踪的实体。如果在上下文中未找到该实体,则将向数据库发送查询以在该数据库中找到该实体。如果在上下文或数据库中找不到该实体,则返回Null。

Find 与在两种重要方式下使用查询不同:

  • 仅当在上下文中未找到具有给定密钥的实体时,才进行数据库往返。
  • Find将返回处于该Added状态的实体也就是说,Find将返回已添加到上下文但尚未保存到数据库的实体。

因此,如果要确保始终出于锁定目的而对数据库进行查询,请避免使用Find,而改用WhereLINQ方法。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章