【问题标题】:Save new or update with LinqToSql, transactions?使用 LinqToSql 保存新的或更新的事务?
【发布时间】:2010-02-26 13:22:27
【问题描述】:

我有一个表,其中包含另一个表中某些项目的命中统计信息。

这个表是这样定义的

ID (Primary key)
ItemId (Foreign key)
Date
Hits

给我一​​个记录公关。项目公关日。

该数据库在多线程环境中使用,因此两个用户可能同时进行第一次点击,从而导致创建两条记录,而我只想要 1 条命中=2。 (因为唯一索引我会得到一个异常)

我如何确保我只有一个记录 pr。项目公关天?

【问题讨论】:

    标签: c# .net database linq-to-sql transactions


    【解决方案1】:

    唯一索引可以工作。那将只允许一条记录。或者,您可以在代码中设置一个锁,检查是否存在具有该 ID 的记录,如果该记录存​​在,则避免插入并通知用户该问题。但如果为 null,则继续插入。

    编辑:锁可以设置为:

    public static object _lock = new object();
    
    public void Save(..)
    {
       lock(_lock) {
          //check for existence of an ID
          //process accordingly
       }
    }
    

    通常建议在锁之前和之后都进行检查,因为随着锁的释放,以前的用户可能已经保存了记录,但是在这里您还必须关心数据库性能,所以也许只是这样做锁里面没问题...您还必须注意,这会阻止其他用户尝试在锁定点保存记录,并且如果数据库很慢,可能会影响您的应用程序的性能...您将必须注意。

    HTH。

    【讨论】:

    • 我不是 SQL Server 或 .Net 同步对象方面的专家,但您所说的“锁”是指可以在 .Net 应用程序进程内部工作的 Mutex 之类的东西吗?跨度>
    • 互斥锁可以工作,你也可以使用我上面说明的 lock 关键字来设置一个锁,将锁块中的代码限制为一个用户。
    【解决方案2】:

    处理此问题的一种方法是通过您在 SQL Server 中创建的索引。使用 SQL Server,您可以创建唯一索引,但是当您尝试添加重复项时,它不会引发异常,它只是忽略重复项。为此,请确保索引类型为“索引”并将“忽略重复键”设置为“是”

    CREATE UNIQUE NONCLUSTERED INDEX IX_MyIndex ON MyTable
    (
       MyColumn
    ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = ON, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
    GO
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2011-12-08
      • 2013-06-17
      • 2014-06-10
      • 2011-11-06
      相关资源
      最近更新 更多