<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MySQL &#8211; HU Xiaoxu</title>
	<atom:link href="https://blog.ihuxu.com/category/computer-science/middleware/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.ihuxu.com</link>
	<description>a software engineer&#039;s blog</description>
	<lastBuildDate>Wed, 18 Jun 2025 15:26:49 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.2</generator>
	<item>
		<title>深入 MySQL 用户自定义变量：使用详解及其使用场景案例</title>
		<link>https://blog.ihuxu.com/explaination-of-the-mysql-variables-usage-and-the-use-case/</link>
					<comments>https://blog.ihuxu.com/explaination-of-the-mysql-variables-usage-and-the-use-case/#comments</comments>
		
		<dc:creator><![CDATA[HU Xiaoxu]]></dc:creator>
		<pubDate>Tue, 04 Oct 2016 02:21:09 +0000</pubDate>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">http://www.ihuxu.com/blog/?p=5879</guid>

					<description><![CDATA[一、前言 在前段工作中，曾几次收到超级话题积分漏记的用户反馈。通过源码的阅读分析后，发现问题出在高并发分布式场景下的计数器上。计数器的值会影响用户当前行为所获得积分的大小。比如，当用户在某超级话题下连续第 n（n 即计数器的值）次进行转发帖子时，将会获得与 n 相关的分数。然而，在第一次改进后问题依然存在。所以，这次在之前的基础上，通过使用 MySQL 变量的途径来解决该问题。 二、到底 MySQL 的变量分哪几类？ MySQL变量一共分为两大类：用户自定义变量和系统变量。如下： 本文涉及的内容为用户自定义会话变量，若对其他分类无感，请点击这里。 PS：用户定义的会话变量和系统定义的会话变量有什么区别？ 局部变量 局部变量一般用于 SQL 的语句块中，比如存储过程中的 begin 和 end 语句块。其作用域仅限于该语句块内。生命周期也仅限于该存储过程的调用期间。 上述存储过程中定义的变量 c 就是局部变量。 会话变量 会话变量即为服务器为每个客户端连接维护的变量。在客户端连接时，使用相应全局变量的当前值对客户端的回话变量进行初始化。设置会话变量不需要特殊权限，但客户端只能更改自己的会话变量。其作用域与生命周期均限于当前客户端连接。 会话变量的赋值： 会话变量的查询： 全局变量 全局变量影响服务器整体操作。当服务器启动时，它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。要想更改全局变量，必须具有 SUPER 权限。全局变量作用于 server 的整个生命周期，但是不能跨重启。即重启后所有设置的全局变量均失效。要想让全局变量重启后继续生效，需要更改相应的配置文件。 全局变量的设置： 全局变量的查询： 三、MySQL用户自定义变量详解 你可以利用 SQL 语句将值存储在用户自定义变量中，然后再利用另一条 SQL 语句来查询用户自定义变量。这样以来，可以再不同的 SQL 间传递值。 用户自定义变量的声明方法形如：@var_name，其中变量名称由字母、数字、“.”、“_”和“$”组成。当然，在以字符串或者标识符引用时也可以包含其他字符（例如：@&#8217;my-var&#8217;，@&#8221;my-var&#8221;，或者@`my-var`）。 用户自定义变量是会话级别的变量。其变量的作用域仅限于声明其的客户端链接。当这个客户端断开时，其所有的会话变量将会被释放。 用户自定义变量是不区分大小写的。 使用 SET 语句来声明用户自定义变量： 在使用 SET 设置变量时，可以使用“=”或者“:=”操作符进行赋值。 当然，除了 SET 语句还有其他赋值的方式。比如下面这个例子，但是赋值操作符只能使用“:=”。因为“=”操作符将会被认为是比较操作符。 mysql&#62; SET @t1=1, @t2=2, @t3:=4; mysql&#62; SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;<div class="read-more"><a class="btn read-more-btn" href="https://blog.ihuxu.com/explaination-of-the-mysql-variables-usage-and-the-use-case/">Read More</a></div>]]></description>
		
					<wfw:commentRss>https://blog.ihuxu.com/explaination-of-the-mysql-variables-usage-and-the-use-case/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>高并发、分布式数据库场景下需要注意的 UPDATE SQL 写法</title>
		<link>https://blog.ihuxu.com/the-problem-of-the-distribution-mysql-to-be-focused-in-the-hight-concurent-request/</link>
					<comments>https://blog.ihuxu.com/the-problem-of-the-distribution-mysql-to-be-focused-in-the-hight-concurent-request/#respond</comments>
		
		<dc:creator><![CDATA[HU Xiaoxu]]></dc:creator>
		<pubDate>Tue, 09 Aug 2016 05:45:26 +0000</pubDate>
				<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[Middleware]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Original]]></category>
		<guid isPermaLink="false">http://www.ihuxu.com/blog/?p=968</guid>

					<description><![CDATA[业务模块 超级话题签到积分 具体场景 更新签到积分行为 表 integration_record &#8211; 每次产生积分行为的记录表。即每当用户产生积分行为（如：在超级话题内进行签到、转发和回复等行为），就会增加一条 integration_record 表的记录。表明该用户在该超级话题下通过哪些行为产生了多少积分增量。 integration &#8211; 每个用户的总积分表。即在每次写入一条 integration_record 记录后，会将积分增量累计加入到该表的总积分字段中。表明目前为止，该用户在该超级话题下通过积分行为一共获取的积分总数。 表的细节就不给出了（也没必要）。这两张表都以话题 ID（topic_id）和用户 ID（uid_id）进行联合索引。 具体问题 在某些情况下，某个用户所在某个话题下的所有 integration_record 记录的积分总和小于该用户在该话题下的 integration 表记录的总积分。 异常日志 通过检查线上异常日志发现，会偶发出现更新 integration 表记录返回0（更新影响记录行数为 0）的情况。但理论上不应该出现这种情况。 分析 进而考虑是由于数据库主从同步的延迟导致。为什么这么猜测？看下面SQL： update integration&#160;set integration = ? where topic_id = ? and uid = ? 上面为改动前（有问题）的 SQL。其中第一个问号代表当前需要更新的积分总数。问题就出现在这个总数上。 这个总数是由当前用户产生的积分行为所增加分数与当前 integration 表中该用户的积分总数（读于从库）之和。 所以，在高并发的请求下，会出现同时待同步如下一些SQL： update integration&#160;set integration = 1720 where topic_id = abc and uid = 12345678 update integration&#160;set integration = 1720 where topic_id<div class="read-more"><a class="btn read-more-btn" href="https://blog.ihuxu.com/the-problem-of-the-distribution-mysql-to-be-focused-in-the-hight-concurent-request/">Read More</a></div>]]></description>
		
					<wfw:commentRss>https://blog.ihuxu.com/the-problem-of-the-distribution-mysql-to-be-focused-in-the-hight-concurent-request/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
