2012-07-10 62 views
0

我的一個客戶端會話在事務中從表中創建一個條目並繼續其處理。交易在隔離模式read committed下運行。同時,另一個客戶端會話報告表中的所有數據。從SQL Server表中選擇鎖定了readcommited IsolationMode的所有行

由於鎖定的行(由其他客戶端插入),選擇所有操作現在完全鎖定。

如何在全部選中期間檢索已提交的數據,而不是完全鎖定?

任何幫助將不勝感激。

+3

你不行。如果您的讀者也使用'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

+0

您可以查看'READPAST'提示。 – 2012-07-10 16:56:24

回答

0

對於您的使用場景,您並沒有非常具體的細節,但可以從表格中獲取數據,但只有一些嚴重警告

您可以使用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.