asp.net - 使用 MySQL、ASP.NET 和 Entityframework 实现原子计数器

标签 asp.net mysql entity-framework atomic

我正在使用 MySQL 和 Entity Framework 在 ASP.NET/C# 中开发一个网络应用程序。我想使用一些计数器列,这些列会经常通过增加其值 +1 来更新。我有一个产品表,其中包含计数器列。我有两个问题:

1) 我应该为计数器使用第二张表吗? - 主产品表将被频繁读取,如果我非常频繁地更新行会影响性能,因为每次更新计数器时该行都会被锁定(我使用 InnoDB)

2) 使用 MySQL 和 Entity Framework 在一行上增加 +1 的最佳方法是什么。我不介意计数器是 100% 准确的,所以如果有一些更新冲突,我可以捕获它们,但我可以在没有更新的情况下通过。我假设大多数更新将快速完成并包含在更新中。

我正在添加一些我用来实现此目的的代码,方法是利用静态变量来防止频繁写入数据库。

代码:

if (Global.DataCounters != null)
    {
        if (Global.DataCounters.ContainsKey(id))
        {
            int new_value = ++Global.DataCounters[id];
            Global.DataCounters.Remove(id);
            Global.DataCounters.Add(id, new_value);

            // check datatime

            if ((DateTime.Now - Global.LastFlushed).Minutes > 10)
            {
                // update counter in db and reset data

                Global.LastFlushed = DateTime.Now;
            }
        }
        else
        {
            // first time view of a device, set to zero views
            Global.DataCounters.Add(id, 1);
        }

    }
    else
    {
        Global.DataCounters = new Dictionary<int, int>();
    }

全局.asax:

public static Dictionary<int, int> DataCounters = new Dictionary<int,int>();
public static DateTime LastFlushed;

void Application_Start(object sender, EventArgs e)
{
    LastFlushed = DateTime.Now;
    RegisterRoutes(System.Web.Routing.RouteTable.Routes);
}

您认为这是一个好的实现吗?

谢谢

最佳答案

计数器的第二个表只有在说重要的产品表读取(比如 > 50%)不需要计数器信息时才有用。否则,您总是会连接两个表,使您的读取变得昂贵。

基于 MySQL doc :对于更新计数器,如果您的 WHERE 条件使用唯一索引来搜索唯一行(以更新),则只会采用行级锁(并且不会采用间隙锁)。这将是您案例的最佳方案(假设产品 ID 可以用作唯一索引)。我建议使用 Entity SQL 来触发 Update 语句(或调用执行相同操作的 SP)。

如果你只想玩实体术语(没有 EntitySQL 或 SP)那么不要为这个特定的操作使用事务范围 - 这样,选择获取产品实体就不会锁定和 SaveChanges 将是一个递增计数器的更新语句。当然,在事务之外使用两个语句意味着更新有可能会失败(假设您有一些时间戳列可用于乐观并发检查)但您已表明它是可以接受的。

最后,如果在递增计数器时事务不可避免,则尝试缩短它们并尝试使用较低的隔离级别,例如 Read Committed

关于asp.net - 使用 MySQL、ASP.NET 和 Entityframework 实现原子计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14451619/

相关文章:

css - Bootstrap - 垂直单选按钮未对齐

asp.net - 一旦达到某个日期,如何使 SQL Server 中的特定行过期?

PHP MYSQL动态选择框

mysql - CakePHP 模型链查找

asp.net - xxx.eot 网络字体文件无法在 IIS 6.0 服务器上正常工作

javascript - 在 ASP .NET MVC 中允许 mime

mysql - 如何计算每年销售的产品总量?

javascript - jQuery API 调用 Entity Framework API Put 方法

entity-framework - Entity Framework - Azure 上的迁移 - 现实场景 - 降级数据库

asp.net - 选择哪种模式? Asp.net Mvc 4