Entity framework 并发更新数据的问题

leonbingo 2016-01-18 04:55:19
有一套系统,系统中会有很多地方去更新用户的积分,所以存在并发的可能性

以前要做一个更新用户的积分,用如下sql语句能达到
Update user set point=point+100

现在用entityframework

var user = GetUserFromDB();
user.Point += 100;
Save(user);

于是在并发状态下,肯定会有如下情况

1. 线程a和b都在试图更改积分。
2. ab都开始读取这个用户的数据
3. a 首先读取且改变数据
4. b读取的时候a还未改变数据,
5. b提交更改

这样,b把a的更改覆盖了,请问entityframework如何解决这种问题,有类似于update user set point=point +100 这样的用法吗?

数据库层面又怎么实现?要如何用锁,表锁好像效能比较低了
...全文
342 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovebaby 2016-03-11
  • 打赏
  • 举报
回复
如果只是一个SQL的问题,EF也是生成SQL,和你直接写SQL实质是一样的,如果你直接写的SQL要优于EF自动生成的SQL,那可以直接写SQL。不要纠结于使用某种技术,能解决你问题的技术才是最好的。
myhope88 2016-03-11
  • 打赏
  • 举报
回复
并发性高的,没啥好的处理办法
Icedmilk 2016-03-10
  • 打赏
  • 举报
回复
http://stackoverflow.com/questions/17971220/atomic-increment-with-entity-framework http://stackoverflow.com/questions/15669383/how-to-inc-dec-multi-user-safe-in-entity-framework-5/15669840#15669840 读取->修改->尝试写入并检查是否改变->如果改变就抛出异常->重新读取->再次修改->...
zhijiacn 2016-03-10
  • 打赏
  • 举报
回复
比如当前对某个商品P没有评级,然后有一天同一时刻A和B都对P评级了,在商品rating表会有一条记录计算他的等级,在详细表里面有两条记录,分别记录A和B对该商品P的评级。但是在商品rating表怎么实现并发控制,保证最后的评级是A和B的平均值呢?
zhijiacn 2016-03-10
  • 打赏
  • 举报
回复
更新的时候用rowversion, 开启表的detectchanges,保存的时候EF会检查版本信息。但是对于同时新增的记录好像没有更好的处理办法。
Justin-Liu 2016-01-22
  • 打赏
  • 举报
回复
我好奇你用sql就不会存在并发问题么?
bpggwyl 2016-01-21
  • 打赏
  • 举报
回复
你这样用EF更新数据有点问题,,你可以直接写到数据访问层 db.user.point+=1;db.savechange;然后每一个现成都调用现在的这个方法.
myhope88 2016-01-20
  • 打赏
  • 举报
回复
不好解决,我遇到类似的问题
leonbingo 2016-01-19
  • 打赏
  • 举报
回复
怎么没有人谈一谈这种场景的处理?
huaneramn 2016-01-19
  • 打赏
  • 举报
回复
高级。。。。。。。。。。。。。。。。。。
leonbingo 2016-01-18
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
ef也可以直接写sql的……
恩,是这样,能直接写,不过他本身没有这方面的实现吗,如果直接写sql,我好像就用不上ef了
一枚大帅哥 2016-01-18
  • 打赏
  • 举报
回复
我记得之前我们是这样解决的。 数据表设计一列时间戳,每次修改后更新时间戳。 查询时将时间戳保存到页面上。 每次执行save前,查询一下时间戳,如果和之前页面上的保存的时间戳不等,则该条数据已被他人更改。 提示用户重新打开后方可保存。 如果你说,可能在我save前查询了时间戳,然后立马被人改了,导致执行save时,其实该数据已被他人修改,这种并发,目前我也不知道有什么好办法。也许只能锁表了吧。
  • 打赏
  • 举报
回复
ef也可以直接写sql的……

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧