2013-12-18 107 views
0

我開始與SqlConnection.BeginTransaction()進行交易,並執行DELETE和一些INSERT s。在隔離級別上我可以進行任何配置,以允許任何查詢在事務過程中以「髒方式」讀取數據?將隔離級別配置爲允許在更新數據時允許ReadUncommited

基本上我想防止鎖定,而我更新數據。問題是;我無法控制SELECT。如果我在事務中定義了一個ReadUncommited隔離級別,外部查詢是否有權在不等待的情況下讀取數據,或者是否需要在此查詢上定義它?

例如:

try 
{       
    connection.Open(); 
    transaction=connection.BeginTransaction(IsolationLevel.ReadUncommited);    

    // DELETE 
    foreach (int i in fibarray) 
    { 
     // INSERTS 
    } 
    transaction.Commit(); 
} 
catch (Exception ex) 
{ 
    if (transaction.Connection != null) 
     transaction.Rollback(); 
}    

同時,SELECTS另一臺機器上我沒有訪問。

+0

每個連接/會話都爲自己建立了自己願意忍受的骯髒程度。沒有辦法讓一個*不同的*連接突然強制連接看到較髒的數據(或者相反,更嚴格) –

+0

@Damien_The_Unbeliever所以沒有辦法告訴我的更新命令不要阻塞。它完全取決於「'SELECT」的一面。 – SysDragon

+0

是的,'SELECT'擁有對其鎖定/阻止行爲的全部控制權。並且'UPDATE'總是必須應用一些排他鎖才能成功完成。 –

回答

2

每個連接/會話都會爲自己建立它願意忍受的骯髒程度。沒有辦法通過不同的連接突然強制連接看到更髒的數據(或者相反,更嚴格)

SELECT s對所有鎖定/阻塞行爲具有全部控制權。並且UPDATE總是必須應用一些排他鎖才能成功完成。所以如果你不能改變SELECT,那麼你無法克服你目前的狀況。

0

嘗試WITH(NOLOCK)條款在另一個SELECTS。該條款將讀取髒數據。

SELECT .... 
FROM <tablename> WITH(NOLOCK) 
WHERE ...... 

更多信息here

編輯: BTW,設置隔離級別ReadUncommited將使當前事務讀取未提交的數據,它不控制的交易的隔離級別當前的範圍。

+0

是的,提出的問題是我無法控制'SELECT's。 – SysDragon

+0

您是否對事務範圍外的SELECT語句嘗試了WITH(NOLOCK)?這將解決你的問題。 – fossilcoder

+0

請閱讀問題。我無法訪問'SELECT'語句,我剛纔告訴過你。你不理解這個問題。 – SysDragon