2011-07-15 45 views
0

當你有例如。連續3次查詢您提交給SQL數據庫的單個字符串,用分號分隔,另一個用戶同時做同樣的事情,我們的查詢將被視爲查詢的「組」或「隊列」它將始終以每個用戶相同的邏輯順序執行,或者這些查詢的隊列是否可以「混合起來」,從而結束了我們的兩個查詢逐個被解僱?排隊多個SQL查詢作爲一個字符串,服務器行爲?

所以基本上我想知道有下列情形MySQL和SQL服務器的哪一個行爲發生這種情況時,如:

  • 執行路徑情況1

  • 用戶1查詢1,用戶1查詢2,用戶1查詢3,用戶2查詢1,用戶2查詢2,用戶2查詢3

  • 執行路徑情況2

  • 用戶1查詢1,用戶2的查詢1,用戶1的查詢2,用戶2的查詢2,用戶1的查詢3,用戶2的查詢3

回答

1

這取決於您的數據庫是否將其視爲多個單獨的查詢或單個事務。如果它將其視爲交易,訂單將無關緊要。如果您想確保它將其視爲單個事務,則可以通過多種方式向數據庫發出信號,告知它應該爲您的查詢創建事務。數據庫(應該)確保四個基本屬性(ACID):

  • 原子 - 整個事務成功或失敗。
  • Consist - 無論事務成功還是失敗,數據庫將始終處於一致狀態。
  • 隔離 - 同時處理多個交易不能互相干擾。
  • 耐用 - 數據庫必須能夠在軟件和硬件故障後恢復已提交的數據。

隔離是與您的情況相關的隔離。您的查詢不應該能夠破壞他人,因此您不必擔心其他用戶同時提交查詢。

此外,我懷疑你的數據庫是從單個處理器運行。您所描述的線性路徑可能不會僅僅因爲數據庫可以同時處理多個查詢而發生。

爲了安全起見,我會以BEGIN TRANSACTION開始查詢並以COMMIT TRANSACTION(或您的數據庫所需的任何語法)結束查詢。如果數據庫確實將其視爲多個單獨的查詢,那麼如果他們對數據庫進行任何寫入操作,則可能會遇到問題。最好使用交易。

+0

只要它是一個MySQL,它依賴於涉及的存儲引擎。 MyISAM引擎**不是**事務性的,所以基本上,每個查詢都完全在單獨的事務中執行。 – spacediver

1

這取決於該數據庫引擎,該鎖定機制到位,交易和其他因素。真的,沒關係...只要他們都是選擇查詢。如果部分或全部查詢包含寫入操作,則應將每個批次包含在事務中以確保原子性。

0

對於SQL Server,特定用戶的查詢將按照指定的順序運行,但它們可以與其他用戶的語句交織,但需要考慮資源何時可用。在事務內部,您可以保證數據的一致性,但是您的語句仍然可能與其他用戶的語句交錯。您使用的語句和鎖的類型將決定其他語句是否能夠訪問您在查詢中使用的相同表和行。

相關問題