timestp 防止更新丢失
假如有一个购票系统:
三个用户A,B,C希望同时订购一张票,可能会读取到同一条未被销售的车票记录,然后再进行更新(购买),为了确保数据的一致性,防止更新丢失,
通常的解决方法是使用updlock 加入更新锁,不过这样会造成资源争用和等待,在并发量很高的情况下,会对性能造成较大的影响。
乐观锁定的解决方案:
给表加入一个 timestamp
类型的字段,每次更新行数据时,该行中的该列都会自动更新
在获取并更新记录的时候,通过比较该列值,就可判断是否已经被更新过。
例:
select top 1 @Id=Id,
@timestp=timestp
from coupon
where isused=0
-- 更新时比较timestamp字段是否已经改变,发生改变则更新失败
update …… where Id=@Id and timestp=@timestp
这种方法也存在一些问题:更新任何字段时都会更新timestamp字段,可能会造成一些错误的更新判断。