2012-11-10 42 views
1

比方說,我有兩個文件file1.phpfile2.phpMySQL以何種順序處理來自2個不同連接的查詢?

file1.php有以下疑問:

-query 1 
-query 2 
-query 3 

file2.php有以下疑問:

-query 4 
-query 5 
-query 6 

比方說,一個遊客首次運行腳本和其他遊客正好運行第二個與此同時。

我的問題是:在執行第一個腳本的所有查詢時,MySQL是否接收到一個連接並將第二個連接保留在隊列中,然後繼續到第二個連接?

MySQL處理查詢的順序是1,2,3,4,5,6(或4,5,6,1,2,3)還是它可以以任何順序?

如何才能確保MySQL在執行其他連接之前執行一個連接的所有查詢?

我關心數據完整性。例如,共享相同帳戶的兩個用戶的帳戶餘額。他們可能會看到相同的值,但是如果他們同時發送查詢,這可能會導致一些意外的結果

回答

3

數據庫可以並行接受來自多個連接的查詢。它可以以任意順序執行查詢,即使在同一時間。隔離級別定義的並行執行可能會多少影響結果:

如果不使用事務,查詢可以並行執行,最強的隔離級別仍保證的查詢將返回同樣的結果彷彿他們不是在並行執行,但仍然可以在任何爲了運行(只要他們每個連接內排序)

如果您使用的事務,數據庫可以保證更多:

最強的我平均水平是serializable,這意味着結果將是好像沒有兩個事務並行運行,但性能會受到影響。

最弱的隔離級別與根本不使用事務相同;什麼事情都可能發生。

如果你想確保數據的一致性,使用交易:

START TRANSACTION; 
... 
COMMIT; 

默認隔離級別是read-commited,這大致相當於serializable與普通SELECT發生的事了 - - 交易。如果您使用SELECT FOR UPDATE每一個事務中選擇,你會得到serializable

參見:http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_repeatable-read

+0

嗨,謝謝您的回覆。我對mvp的回答發表了評論,以描述我主要關心的問題。 Regards – eric01

+0

@ eric01查看更新 –

+0

感謝您的。交易似乎是一個可行的解決方案。 – eric01

2

通常,您無法預測或控制執行順序 - 它可以是1,2,3, 4,5,6或4,5,6,1,2,3或1,4,2,5,3,6或它們的任意組合。

MySQL並行執行來自多個連接的查詢,服務器性能在所有客戶端共享(在您的案例中爲2個)。 我不認爲你有理由擔心或改變這種情況--MySQL是爲了能夠服務多個連接而創建的。

如果你有性能問題,他們通常可以通過添加索引或更改數據庫模式來解決 - 就像標準化或反規範化表一樣。

+0

嗨,謝謝你的迴應。我關心數據完整性。例如,共享相同帳戶的兩個用戶的帳戶餘額。他們可能會看到相同的價值,但是如果他們同時發送查詢,這可能會導致一些意想不到的結果 – eric01

1

您可能會限制max_connections爲1,但它會給你too many connections錯誤的其他連接。限制併發執行是沒有意義的。

1
  1. 使操作爲transaction,並設置自動提交虛假
  2. 訪問所有的表中以相同的順序因爲這可以防止死鎖。