2011-09-13 42 views
2

考慮查詢:的MySQL變量設置黑客

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

將生成的查詢總是產生1,即使有在同一時間運行或許多其他類似的查詢(如接近時間,因爲他們可以同得到)將@xxx設置爲不同的整數。

另外,究竟是@xxx的範圍?

我想確定如果這是一個安全(雖然哈克)的方式來確保一個變量設置爲我想要的生命特定查詢的值。

這些查詢是針對MySQL 5.5的單個實例運行的,並且可以在相同的連接或不同的數據庫連接上完成。

回答

2

從我剛纔測試的結果來看,這個變量看起來只在當前連接上出現。或者更確切地說,在它所在的連接上。

我相信你的SQL語句與SET statementUser Defined Variables具有相同的效果。

的量,文檔指出:

用戶定義的變量是特定於連接的。也就是說,一個客戶端定義的用戶變量不能被其他客戶端看到或使用。客戶端連接的所有變量在客戶端退出時自動釋放。

因此,如果其他查詢使用的是自己獨立的連接,那麼它們將擁有自己的@xxx副本,並且不會互相干擾。你的黑客將按預期工作。但是,如果使用相同的連接並且不能保證查詢執行的順序,則其他查詢可以更改@xxx並影響後續查詢。

關於如果總是返回1:

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

它應該,但如果使用的是同一個連接有一個異常的機會,使用相同的連接單獨的線程中執行SET @xxx=2剛過子查詢的執行和在外部選擇之前。如果我在這裏選擇了SELECT的ATOMICITY,請糾正我。

+0

我的測試顯示了相同的結果,它是每個連接隔離的。然而,我仍然對選擇語句的原子性很感興趣,因爲在第一個選擇讀取它之前,第二個選擇可能會改變變量的可能性很小。 – bradvido