热点数据更新是指频繁更新某个或某些特定行的数据,比如大促期间,有一个大商家,如小米旗舰店、Apple旗舰店等他们的某个商品,会因为有很多人要买,所以他就是热点商品,而大家在短时间内同时买这个商品的时候,就会热点更新这个商品的库存,这就是所谓的热点数据更新,或者叫做热点行更新,如:
UPDATE products
SET stock_quantity = stock_quantity - 10
WHERE product_id = 10086;
热点数据的更新是我们需要避免的,因为他存在以下问题:
1、锁竞争,热点数据的更新是通过update语句进行的,而update是需要给记录增加排他锁的,这就会导致大量的请求被阻塞。降低整个系统的吞吐量。
2、占用数据库连接,当有大量的update语句,因为要修改同一条记录而被阻塞的时候,他们持有的数据库连接是不会释放的,而数据库连接又是有限的,所以会导致连接数不够,进而影响整个系统的吞吐量及可用性。
3、耗尽数据库CPU,大量锁等待,就会导致大量的自旋,多个线程就会不断的尝试获取锁,CPU就需要不断的执行自旋操作,消耗大量CPU时间。并且在这个过程中,操作系统也需要频繁的进行线程上下文的切换,这个过程会导致CPU时间片的浪费。
4、死锁风险,在高并发的情况下。由于数据库需要频繁定位和更新这些特定行,可能会增加锁竞争和死锁的风险,影响并发性能。
5、索引维护开销大,频繁的更新热点数据,不仅会导致数据的变化,还可能导致相关索引的频繁维护,这可能会增加数据库的开销,导致性能下降。
6、主从不一致,热点数据的频繁更新,如果在主从复制出现延迟的情况下,就会放大数据不一致的概率。