深入 MySQL 用户自定义变量:使用详解及其使用场景案例

一、前言在前段工作中,曾几次收到超级话题积分漏记的用户反馈。通过源码的阅读分析后,发现问题出在高并发分布式场景下的计数器上。计数器的值会影响用户当前行为所获得积分的大小。比如,当用户在某超级话题下连续第 n(n 即计数器的值)次进行转发帖子时,将会获得与 n 相关的分数。然而,在第一次改进后问题依然存在。所以,这次在之前的基础上,通过使用 MySQL 变量的途径来解决该问题。二、到底 MySQL 的变量分哪几类?MySQL变量一共分为两大类:用户自定义变量和系统变量。如下用户自定义变量局部变量会话变量系统变量会话变量全局变量本文涉及的内容为用户自定义会话变量,若对其他分类无感,请点击这里。PS:用户定义的会话变量和系统定义的会话变量有什么区别?局部变量局部变量一般用于 SQL 的语句块中,比如存储过程中的 begin 和 end 语句块。其作用域仅限于该语句块内。生命周期也仅限于该存储过... Read More

高并发、分布式数据库场景下需要注意的 UPDATE SQL 写法

业务模块超级话题签到积分具体场景更新签到积分行为表integration_record - 每次产生积分行为的记录表。即每当用户产生积分行为(如:在超级话题内进行签到、转发和回复等行为),就会增加一条 integration_record 表的记录。表明该用户在该超级话题下通过哪些行为产生了多少积分增量。integration - 每个用户的总积分表。即在每次写入一条 integration_record 记录后,会将积分增量累计加入到该表的总积分字段中。表明目前为止,该用户在该超级话题下通过积分行为一共获取的积分总数。表的细节就不给出了(也没必要)。这两张表都以话题 ID(topic_id)和用户 ID(uid_id)进行联合索引。具体问题在某些情况下,某个用户所在某个话题下的所有 integration_record 记录的积分总和小于该用户在该话题下的 integration 表记录... Read More