2011-02-16 99 views
2

我有幾個線程執行一些帶有可序列化隔離級別的SQL select查詢。我不確定要選擇哪種實施方式。這:可序列化的隔離級別原子性

_repository.Select(...) 

或本

lock (_lockObject) 
{ 
    _repository.Select(...); 
} 

換句話說,是有可能的幾個交易將開始在同一時間,並選擇操作範圍內部分塊記錄執行。

P. S.我正在使用MySQL,但我想這是一個更普遍的問題。

回答

3

交易執行SELECT查詢放置在排共享鎖,從而允許其它事務讀取那些行中,但防止它們使得對行的變化(包括插入新記錄到間隙)

鎖定在應用程序做別的東西,它不會允許其他線程輸入代碼塊從庫中提取數據,這種做法可能會導致非常糟糕的表現有以下幾個原因:

  1. 如果任何行被另一個事務(應用程序外)通過排他鎖鎖定,則應用程序中的鎖定將無濟於事。
  2. 即使在沒有以獨佔模式鎖定(未更新)的行上,多個事務也不能執行讀取操作。
  3. 在所有數據被提取並返回給客戶端之前,鎖不會被釋放。這包括網絡延遲以及將MySql結果集轉換爲代碼對象所需的任何其他開銷。
  4. 最重要的是,執行數據完整性&原子性是數據庫的工作,它知道如何處理它,以及如何檢測潛在的死鎖。何時執行記錄鎖定以及何時添加索引間隙鎖定。它是什麼數據庫是和MySQL是ACID投訴,並被證明處理這些情況

我建議你通過MySQL文檔的Section 13.2.8. The InnoDB Transaction Model and Locking閱讀,它會給你一個很大的啓示是如何在InnoDB中鎖定執行。