0

我有n臺機器在同一時間寫入數據庫(sql服務器)(啓動事務)。我將隔離級別設置爲可序列化。我的理解是,無論哪臺機器的事務首先到達數據庫,都會被執行,而其他事務將在完成時被阻止。SQL服務器隔離級別

這是正確的嗎?

+0

事務不鎖定整個服務器。在表級別,您可以執行行鎖定,頁面鎖定或表鎖定。你確定你需要序列化嗎?鎖越廣泛,限制併發越多。 – Paparazzi 2012-08-14 15:32:01

回答

0

是的,這對於任何隔離級別的寫操作都是正確的:「我的理解是,無論哪臺機器的事務先到達數據庫,執行完畢,其他事務將在此過程中被阻止。」

隔離級別有助於確定在讀取數據時發生的情況。可串行化的讀取操作將阻止您的寫入操作,這可能是您想要的行爲。

2

這取決於他們是否都在進行相同的活動?也就是說,完全相同的語句以相同的順序執行,沒有流量控制?

如果不是,並且兩個連接正在訪問數據庫中的獨立對象,它們可以並行運行。

如果資源有一些重疊,那麼可能會有多個進程通過多個連接進行,直到他們中的一個想要獲取另一個已經擁有的鎖定 - 此時它將等待。那麼就存在死鎖的可能性。


SERIALIZABLE

  • 語句無法讀取已修改但其他事務尚未提交的數據。

  • 沒有其他事務可以修改當前事務讀取的數據,直到當前事務完成。

  • 其他事務不能插入具有鍵值的新行,該鍵值落在當前事務中任何語句讀取的鍵的範圍內,直到當前事務完成。

+0

他們都在進行相同的活動。流量控制在那裏。在事務開始時,如果數據庫反映了該事務所具有的同一組數據已被提交,則它完成該事務。 – Sam 2012-08-14 20:25:03

2

取機的事務獲取到DB第一,被執行並且,當這完成

沒有其他事務將被阻塞,這我不正確。如果每個事務一個接一個地執行(連續執行,因此隔離級別名稱),結果應該是,作爲。但是引擎可以自由使用任何它喜歡的實現,只要它能夠保證可序列化的隔離模型。有些引擎實際上實現它,就像你描述它一樣,例如。 Redis Transactions(雖然Redis沒有'隔離級別'概念)。

對於SQL Server,事務將並行執行,直到它們遇到鎖衝突。發生衝突時,授予鎖的事務將繼續不受干擾,而以衝突模式請求鎖的那個事務必須等待鎖釋放(以允許授予的事務提交)。哪個事務恰好是請求,哪個恰好是被授予的,完全取決於正在執行的內容。這意味着很有可能第一臺機器等待時,機器首先獲得授權並首先完成。

爲了更好地理解鎖定行爲下串行隔離級別的不同之處,見Key-Range Locking