Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc Linq到SQL数据并发-仅使用PKs安全吗?_Asp.net Mvc_Linq To Sql_Concurrency - Fatal编程技术网

Asp.net mvc Linq到SQL数据并发-仅使用PKs安全吗?

Asp.net mvc Linq到SQL数据并发-仅使用PKs安全吗?,asp.net-mvc,linq-to-sql,concurrency,Asp.net Mvc,Linq To Sql,Concurrency,我在基于MVC的网站上发现一个错误,该错误与Linq to SQL中的数据并发有关: “未找到或更改行” 在阅读了这里的几篇文章之后,似乎一个公认的解决方案是在dbml设计器中将所有非主键字段设置为UpdateCheck=false。在冒险做这件事之前,我想问,如果我这样做,我会失去什么吗 老实说,在我看来,应该总是这样,因为使用主键应该是找到记录的最快方法。这将假设您没有任何复合PK。我对数据并发场景不是很熟悉,但我是否遗漏了什么 谢谢你的时间 [编辑] 谢谢大家的反馈!更详细地说,我的具体场

我在基于MVC的网站上发现一个错误,该错误与Linq to SQL中的数据并发有关:

“未找到或更改行”

在阅读了这里的几篇文章之后,似乎一个公认的解决方案是在dbml设计器中将所有非主键字段设置为UpdateCheck=false。在冒险做这件事之前,我想问,如果我这样做,我会失去什么吗

老实说,在我看来,应该总是这样,因为使用主键应该是找到记录的最快方法。这将假设您没有任何复合PK。我对数据并发场景不是很熟悉,但我是否遗漏了什么

谢谢你的时间

[编辑]

谢谢大家的反馈!更详细地说,我的具体场景如下:

我有一个包含许多字段(标题、内容、作者等)的文章表。其中一个经常更新的字段(任何人查看文章时)是一个流行字段,它会随着每次单击而增加。当我更新数据库中的文章文本时,我看到了上面提到的原始错误。然后导航到live站点上的那篇文章(该站点试图更新流行度字段)

首先,听起来我不需要使用共享数据上下文。除此之外,还可以考虑将某些字段设置为UpdateCheck never。也就是说,我绝对不希望由于并发性问题,文章的流行度得不到更新。因此,在这种情况下,有没有一种方法可以让我以乐观的并发性来确保这一点?


再次感谢

我有时会将设计器中实体类的主键更改为
UpdateCheck
,而不是
Never
。您丢失的是自加载数据后对其进行临时更改的通知;你最终得到的是一种“最后一次改变获胜”的情景。如果这在你的情况下是可以的,那么。。。好的

在某些情况下,这绝对不是一件好事。例如,检查/调整银行账户资金余额。。。或者,对字段的替换将基于当前值作为操作数之一的计算

在dbml设计器中将所有非主键字段设置为UpdateCheck=false。在冒险做这件事之前,我想问,如果我这样做,我会失去什么吗

并发机制的工作是防止多个用户互相踩踏更改悲观并发通过在读取记录时锁定对记录的更改来实现这一点。然后在更改完成时解锁记录乐观并发通过记住记录读取时的样子,然后在记录发生更改时不修改记录来实现这一点

Linq to Sql使用乐观并发性。如果以这种方式设置UpdateCheck属性,则禁用了乐观并发检查

考虑一下这个记录:

  • 客户(Name=“Bob”,Job=“程序员”,工资=35000.00)
  • LinqToSql DataContext#1读取记录
  • LinqToSql DataContext#2读取记录并提交以下更改(Salary=50000.00)
  • LinqToSql DataContext#1尝试提交以下更改(Job=“看门人”)

使用乐观并发,DataContext#1现在可以解决一个并发异常。没有乐观的一致性,我们现在有一个收入为5万英镑的看门人。

我还想补充;如果您经常出现并发错误,那么您可能正在以某种非最佳方式执行某些操作;通常,您不应该在网页调用之间缓存
DataContext
或实体对象本身。执行数据更改的操作方法应该是从新的DataContext重新加载实体对象,根据需要更改属性,然后保存。如果一个站点的使用率很高,你会看到一些并发的事情发生在那里,但它可能并不那么常见;所以我想我也应该补充一下。谢谢你的反馈!听起来我在这里做错了几件事。首先,我实际上使用的是一个共享(在c#中是静态的)dataContext对象,通过它执行我的所有查询、插入和更新。从你告诉我的来看,这是个坏习惯。我会在这里做一些调整。除此之外,我可以看到在某些字段上将updatecheck设置为false是有问题的。我在我原来的帖子中添加了更多的信息来详细说明这一点;谢谢你的解释。。。但是,当您只更新一个字段时,情况又如何呢。例如,我在文章表上有一个流行字段。每次有人看那篇文章时,我都会在“受欢迎程度”一栏中加分。理想情况下,我决不希望由于冲突而不更新该列。因此,如果有10个人同时观看了这篇文章,我希望每次都能更新流行度字段。确保这种情况发生的最佳方法是什么?乐观并发不是解决问题的方法吗?要么需要并发,要么需要相对更新集ViewCount=ViewCount+1