我的一個客戶端會話在事務中從表中創建一個條目並繼續其處理。交易在隔離模式read committed
下運行。同時,另一個客戶端會話報告表中的所有數據。從SQL Server表中選擇鎖定了readcommited IsolationMode的所有行
由於鎖定的行(由其他客戶端插入),選擇所有操作現在完全鎖定。
如何在全部選中期間檢索已提交的數據,而不是完全鎖定?
任何幫助將不勝感激。
我的一個客戶端會話在事務中從表中創建一個條目並繼續其處理。交易在隔離模式read committed
下運行。同時,另一個客戶端會話報告表中的所有數據。從SQL Server表中選擇鎖定了readcommited IsolationMode的所有行
由於鎖定的行(由其他客戶端插入),選擇所有操作現在完全鎖定。
如何在全部選中期間檢索已提交的數據,而不是完全鎖定?
任何幫助將不勝感激。
對於您的使用場景,您並沒有非常具體的細節,但可以從表格中獲取數據,但只有一些嚴重警告。
您可以使用READ UNCOMMITTED
快照隔離級別,正如marc_s所述,並且與在事務中的所有select語句上使用WITH (NOLOCK)
具有相同的效果。如果您只想讀取該表,但通常會正常處理所有其他讀取操作,那麼最好將NOLOCK
提示放在查詢中的特定表上。因此,舉例來說:
SELECT *
FROM firstTable f INNER JOIN
secondTable s WITH (NOLOCK) on f.Key = s.Key
這將發出一個正常的讀鎖firstTable
但沒有鎖閱讀secondTable
。沒有鎖可能是相當危險的 - 因爲你可以有效地破壞數據。如果執行的插入操作會重新排序數據並導致頁面拆分,那麼您可以兩次獲取同一行,並獲得各種類似的不愉快。
所以這是可能的,但它不是理想的,而你應該警惕的影響。 Some good further reading is here, courtesy of Jason Strate.
你不行。如果您的讀者也使用'READ COMMITTED'來獲取提交的數據,那麼它將被阻止。你可以使用'READ UNCOMMITTED' - 但是你也會得到未提交的數據。 [也許你應該查看'READ COMMITTED SNAPSHOT ISOLATION'事務級別](http://msdn.microsoft.com/en-us/library/tcbchxcb%28v=vs.80%29.aspx) - 這可能會解決你的問題問題(通過使用快照) - [但它有其他缺點](http://www.jimmcleod.net/blog/index.php/2009/08/27/the-potential-dangers-of-the-read-committed -snapshot-isolation-level /)(TempDB上的壓力較高) – 2012-07-10 14:36:04
您可以查看'READPAST'提示。 – 2012-07-10 16:56:24