MySQL设置变量hack

时间:2011-09-13 20:03:40

标签: mysql

考虑查询:

SELECT @xxx As thevar FROM (SELECT @xxx:=1) as temp

生成的查询总是会产生1,即使有许多其他类似的查询同时运行(或接近他们可以获得的同时),它们将@xxx设置为不同的整数。

此外,@xxx的范围究竟是什么?

我正在尝试确定这是否是一种安全(尽管是hacky)方式,以确保将变量设置为我想要的特定查询的生命值。

这些查询针对MySQL 5.5的单个实例运行,可以在相同的连接或与数据库的不同连接上完成。

1 个答案:

答案 0 :(得分:2)

根据我刚刚测试过的,似乎变量只在当前连接上看到。或者更确切地说,就是设置它的连接。

我相信您的SQL语句与SET statementUser Defined Variables具有相同的效果。

其中声明的文件:

  

用户定义的变量是特定于连接的。也就是说,其他客户端无法看到或使用由一个客户端定义的用户变量。当客户端退出时,将自动释放给定客户端连接的所有变量。

因此,如果其他查询使用自己的单独连接,那么它们将拥有自己的@xxx副本,并且不会相互干扰。你的黑客将按预期工作。但是如果使用相同的连接并且无法保证查询执行的顺序,则其他查询可以更改@xxx并影响后续查询。

关于它是否总是返回1:

SELECT @xxx As thevar FROM (SELECT @xxx:=1) as temp

它应该,但是如果使用相同的连接,则在执行子查询之后和外部选择之前,使用相同连接的单独线程执行SET @xxx=2的异常值很大。如果我对SELECT的ATOMICITY错了,请纠正我。