并发下 这个怎么解决

invaderii 2015-06-26 09:36:00
ALTER PROCEDURE [dbo].[spAAA_test]
AS

declare @i int
select @i = value from AAA_test where ID=1
update AAA_test set Value = @i+100 where ID=1
update AAA_test set Value = Value+100 where ID =2
...全文
215 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
rfq 2015-07-08
  • 打赏
  • 举报
回复
添加 表提示 with(tablelockx)
rfq 2015-07-08
  • 打赏
  • 举报
回复
添加表提示 with (holdlock)
menggang9802 2015-06-29
  • 打赏
  • 举报
回复
回头找资料研究一下
Tiger_Zhao 2015-06-29
  • 打赏
  • 举报
回复
事务肯定是要的,好像说要 WITH(ROWLOCK,UPDLOCK) 一起才起作用。

又:并发模拟用两个查询窗口,前一个用 WAITFOR DELAY 语句等待一下就可以。
invaderii 2015-06-26
  • 打赏
  • 举报
回复
要不 我写 update AAA_test set Value = Value+100 where ID =2 给你比较做什么
invaderii 2015-06-26
  • 打赏
  • 举报
回复
select @i = value from AAA_test where ID=1 update AAA_test set Value = @i+100 where ID=1 这样写就是为了 模拟并发出现的问题
invaderii 2015-06-26
  • 打赏
  • 举报
回复
大哥 我说的意思是 并发
Landa_Tiny_cui 2015-06-26
  • 打赏
  • 举报
回复
引用 1 楼 Tiger_Zhao 的回复:
都是+100,一句话搞定
update AAA_test set Value = Value+100 where ID=1 OR ID=2
像这种简单的题目留给我们这些新人好么
Tiger_Zhao 2015-06-26
  • 打赏
  • 举报
回复
都是+100,一句话搞定
update AAA_test set Value = Value+100 where ID=1 OR ID=2
invaderii 2015-06-26
  • 打赏
  • 举报
回复
我是用 代理作业 仿的并发执行
invaderii 2015-06-26
  • 打赏
  • 举报
回复
行锁 好像并不能解决 select @i = value from AAA_test WITH(ROWLOCK) where ID=1
invaderii 2015-06-26
  • 打赏
  • 举报
回复
那事务处理还要吗
Tiger_Zhao 2015-06-26
  • 打赏
  • 举报
回复
select @i = value from WITH(ROWLOCK) AAA_test where ID=1
invaderii 2015-06-26
  • 打赏
  • 举报
回复
ALTER PROCEDURE [dbo].[spAAA_test] AS begin tran declare @i int update AAA_test set v = 100 where ID=1 select @i = value from AAA_test where ID=1 update AAA_test set Value = @i+100 where ID=1 update AAA_test set Value = Value+100 where ID =2 commit tran 改成这样 可以得到我想要的结果。但是非要多一个update.
invaderii 2015-06-26
  • 打赏
  • 举报
回复
实际情况并没有增量这么简单
invaderii 2015-06-26
  • 打赏
  • 举报
回复
并发 就是同时执行 exec spAAA_test 结果会是 id1的 100 和id2的 200 也就是 select @i = value from AAA_test where ID=1 并发取出来的值会是 0的上面加100 取了二次0的值 不是100的值 正确的并发第一次 +100 再并发一次+100 最终并发处理得当 正确结果应该会是200 id2的是给参考结果说明确实并发执行了二次。但id1现在得出来的结果并不是我想要的200 而是错误的100
Tiger_Zhao 2015-06-26
  • 打赏
  • 举报
回复
你根本没描述怎么个“并发”!
认为你担心ID=1的记录Value前后不一致,直接按照增量去更新,不用取值啊。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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