sqlserver如何避免并发select update 相同行

baibaip22 2018-01-05 12:07:06
这张表每日新增数据200万条
然后 需要大量的 结算

我的做法
1.
每隔10秒 对比一次结果
select top 5000 id,Cath,C_Content,C_time,.... from Cath_HK where C_Result=0
update........
各种超时 (但这样不会出并发问题)

2. 出现并发数据重复问题 (当A没有执行完的时候,B也在执行的时候 就update两次 ,那么会员积分就不断的增加了)
A :select top 5000 id,Cath,C_Content,C_time,.... from Cath_HK where C_Result=0 and [userid]=64
B :select top 5000 id,Cath,C_Content,C_time,.... from Cath_HK where C_Result=0
update........
每个用户打开自己的页面 自动结算 外加定时全表扫描(效率上来了 ,但是 结算嗷嗷算重复)

PS,由于频发insert 没加索引
是不是 我给C_Result 加上索引 然后“在访问索引时使用行锁”“在访问索引时使用页锁” 就可以避免并发问题了?

数据量较大 不敢随意加索引 ! 望高手解答
...全文
469 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 2018-01-05
  • 打赏
  • 举报
回复
参考1楼,事务+锁,这样能避免并发时,SELECT 的数据被另一个事务更新 如果连读取也要防止,使用 UPDLOCK 取代 HOLDLOCK
OwenZeng_DBA 2018-01-05
  • 打赏
  • 举报
回复
关于第二点,我看的不是很明白,是怎么重复的
二月十六 2018-01-05
  • 打赏
  • 举报
回复
select的时候加个锁
BEGIN TRAN 
SELECT  id ,
        Cath ,
        C_Content ,
        C_time
FROM    Cath_HK  (HOLDLOCK) --加个锁
WHERE   C_Result = 0   
COMMIT TRAN 

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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