日期:2014-05-17  浏览次数:20607 次

高并发update疑问

update [table1] set score=score-@score,historyscore=historyscore+@score where id=@id


有人说update自带锁.
但似乎高并发有问题,如何加锁保证这条语句的高性能呢?

实际情况数百线程会同时执行一个where条件,但同时又会有N个where条件条件执行.
------解决方案--------------------
在ID上加索引
------解决方案--------------------
默认隔离级别下,update会阻塞其他事务访问这些数据,如果要保证数据查询的准确性,不能用with nolock,可以使用快照隔离模式,避免update的时候其他读操作有阻塞。而你的目的应该是保证where id=@id能够足够的快,update完就释放,尽可能降低其他事务的等待时间
------解决方案--------------------
table1.id是唯一的吧? 其上应有索引.

高并发时,会产生阻塞.但问题应该不大.
------解决方案--------------------
引用:

update [table1] set score=score-@score,historyscore=historyscore+@score where id=@id


有人说update自带锁.
但似乎高并发有问题,如何加锁保证这条语句的高性能呢?

实际情况数百线程会同时执行一个where条件,但同时又会有N个where条件条件执行.


确实是这样的,由于update是修改数据,所以在运行时会在所修改的数据上加X独占锁,以保证数据修改的一致性。

向你的系统,是个典型的高并发系统,某一时间会有大量的会话运行update语句来修改数据,
你可以通过对update语句中的where条件中的字段,建立索引,来加快update的速度。

那么这样的话,在同一时间内,就可以支持更多的update更新了,而且由于速度更快,使得锁定数据的时间更短,这样也不会导致严重的阻塞问题,可以说是一举多得。
------解决方案--------------------
引用:

update [table1] set score=score-@score,historyscore=historyscore+@score where id=@id


有人说update自带锁.
但似乎高并发有问题,如何加锁保证这条语句的高性能呢?

实际情况数百线程会同时执行一个where条件,但同时又会有N个where条件条件执行.


同时数百线程更新 同id的1条记录?
如果这种需求,并发这么高,可能还是先插入到一个日志表(id,score增量),
由一个线程定时把日志里的记录update到业务表
------解决方案--------------------
引用:
Quote: 引用:

table1.id是唯一的吧? 其上应有索引.

高并发时,会产生阻塞.但问题应该不大.


table1.id 是主键,不会有并发问题吗?

并发时会产生阻塞.但问题应该不大.
LZ是遇到什么问题?还是仍在设计阶段?
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

table1.id是唯一的吧? 其上应有索引.

高并发时,会产生阻塞.但问题应该不大.


table1.id 是主键,不会有并发问题吗?

并发时会产生阻塞.但问题应该不大.
LZ是遇到什么问题?还是仍在设计阶段?


高并发疑似两个字段的值更新不准.没问题就好.


不会有问题的,高并发可能会导致系统对请求的相应时间下降,但不会导致值不准确的问题,呵呵,放心吧。
------解决方案--------------------
默认隔离级别会保证你的更新准确
------解决方案--------------------
如果ID有索引的话 默认隔离级别下面 可能只锁定这条语句 不会影响其他的