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

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

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

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