RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 831559
Accepted
Дмитрий Полянин
Дмитрий Полянин
Asked:2020-05-22 16:06:53 +0000 UTC2020-05-22 16:06:53 +0000 UTC 2020-05-22 16:06:53 +0000 UTC

锁和隔离级别

  • 772

我有这个统计模块代码:

using(TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions {IsolationLevel = IsolationLevel.RepeatableRead})) 
{
     PersonDayStatisticsUnit pdsu = db.PersonDayStatisticsUnits.FirstOrDefault(x => x.UnitId == su.Id && x.Date == now && x.PersonAnonimousGuid == personGuid);
     if (pdsu == null) 
     {
         pdsu = new PersonDayStatisticsUnit() 
         {
             UnitId = su.Id,
                 Count = 1,
                 Date = now,
                 PersonAnonimousGuid = personGuid
         };
         db.PersonDayStatisticsUnits.Add(pdsu);
         ret = true;
     } 
     else 
     {
         pdsu.Count++;
         ret = false;
     }

     db.SaveChanges();

     scope.Complete();
 }

此代码在 ASP.NET MVC 5 上下文中工作。

发现此代码失败,出现无法使用重复键创建记录的错误。

错误是什么,我意识到显然两个线程进入了事务并试图创建同一个对象PersonDayStatisticsUnit,db.PersonDayStatisticsUnits.Add(pdsu).

也就是说,我错过了代码中的某些内容......

据我了解,所有这些代码都可以简单地放在 中lock,这应该可以解决问题。

这里有必要lock吗?解决这种情况的最佳方法是什么?事务如何与lock-s 关联,它们可以或应该同时完成,还是只需要在这里进行不同类型的事务IsolationLevel?

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Vadim Bondaruk
    2020-05-22T16:10:55Z2020-05-22T16:10:55Z

    在那种情况下,我会尝试设置 IsolationLevel Serializable。如果它没有帮助,那么你可能需要一个锁。

    • 2
  2. Best Answer
    user177221
    2020-05-22T23:59:46Z2020-05-22T23:59:46Z

    设置 IsolationLevel 和 lock(在一般情况下)都无济于事。

    如果您只有一个应用程序实例,lock会有所帮助。那些。如果您的应用程序很小并且不打算扩展,这是一个很好的解决方案。

    一般来说——如果你有两个或更多的服务器——锁不会有帮助。


    IsolationLevel 无济于事,因为它不能按您期望的方式工作。它控制两件事:

    • 每个请求设置什么锁
    • 持有多长时间的锁

    如果尝试在资源(表、行、部分)上设置锁,但锁不兼容,则请求会一直等待,直到该特定锁被释放。比如你可以同时下注两个S锁,同时下注S和U,但不能下注两个U。

    这在Transaction Locking and Row Versioning Guide中有足够详细和广泛的描述,但简而言之,

    • SELECT 设置 S 锁
    • 取决于锁定级别——它们要么在读取时被持有,要么直到事务结束
    • S锁相互兼容

    因此,在任何级别的事务隔离中,您都可以进行同时提取。

    如果您需要禁止同时选择 - 您需要 - 在选择期间设置不是 S-lock,而是 U-lock 或 X-lock - 保持它直到事务结束

    可以通过查询文本中的提示更改锁定类型和级别 (TABLE HINT)

    那些。您要么在第一个 SELECT 中,要么在它之前,您需要执行 SQL

    SELECT top 1 somecolumn FROM PersonDayStatisticsUnits
    WHERE (xlock, tablock)
    

    这将阻止在另一个事务中执行完全相同的 SQL。或者,您可以查找为 EF 准备的内容,例如HintsInterceptor,并将适当的提示附加到第一个查询或整个表。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5