0

我有一個是這樣的代碼:
「髒讀」與READUNCOMMITTED隔離級別設置事務範圍中不工作

using (TransactionScope scope = 
    new TransactionScope(TransactionScopeOption.Required), new TransactionOptions) 
{ 

    IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted })) 
    // "dirty" read for test purposes , to see if my 
    // select will actually select the information I just inserted 

    actual = target.GetCostCentersRates(accountId); 

} 

這不工作,我已經測試查詢和他們有效地工作時數據被提交,但是當它沒有提交時,它提出了不允許我檢查髒讀的問題,即使隔離級別設置爲readuncommitted。 我想知道爲什麼我不能訪問這些信息,因爲我不能以任何方式將信息提交給我們的數據庫,因爲這是一種測試方法。
謝謝!

這裏是整個事情

public void GetCostCentersRatesTest() 
    { 

     using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommited })) 
     { 
      //Arrange 
      BRL.AdministrativeArea.SystemClientBusinessRole systemClient = new BRL.AdministrativeArea.SystemClientBusinessRole(); 
      int systemClientId = systemClient.InsertSystemClient(systemClientInfo).systemClientId; 
      BRL.BRLProperties.systemClientId = systemClientId; 
      employeeInfo.multiCompaniesInfo.systemClientId = systemClientId; 
      int stateId = 1; 
      int cityId = 1; 
      int functionId = 1; 
      employeeInfo.stateId = stateId; 
      employeeInfo.cityId = cityId; 
      employeeInfo.functionId = functionId; 
      int employeeId = employees.InsertEmployeers(employeeInfo); 
      BRL.BRLProperties.employeeId = employeeId; 
      IActionReturnInfo actionAccount = (accounts.InsertAccountPlan(accountPlanInfo)); 
      int accountId = Convert.ToInt32(actionAccount.UpdateDataSourceList[0].ToString()); 
      clientInfo.stateId = stateId; 
      clientInfo.cityId = cityId; 
      clientInfo.stateIdCorrespondency = stateId; 
      clientInfo.cityIdCorrespondency = cityId; 
      clientInfo.stateIdDelivery = stateId; 
      clientInfo.cityIdDelivery = cityId; 
      clientInfo.multiCompaniesInfo.systemClientId = systemClientId; 
      clientInfo.multiCompaniesInfo.employeeId = employeeId; 
      int clientId; 
      clients.InsertClient(clientInfo, out clientId); 
      centerCostInfo.systemClientId = systemClientId; 
      centerCostInfo.clientId = clientId; 
      centerCostInfo.employeeId = employeeId; 
      centerCostInfo.directorID = employeeId; 
      centerCostInfo.managerID = employeeId; 
      centerCostInfo.multiCompaniesInfo.systemClientId = systemClientId; 
      centerCostInfo.multiCompaniesInfo.employeeId = employeeId; 
      IActionReturnInfo action = new CenterCostsBusinessRole().InsertCostCenter(centerCostInfo); 
      int centerCostId = Convert.ToInt32(action.UpdateDataSourceList[0].ToString()); 
      rate.accountId = accountId; 
      rate.centerCostId = centerCostId; 
      costCenterRates.Add(rate); 
      int costCenterRateId; 
      AccountBusinessRole target = new AccountBusinessRole(); 
      DataSet actual; 

      IActionReturnInfo costCenterRateAction = accounts.InsertCenterCostRates(costCenterRates); 
       costCenterRateId = Convert.ToInt32(costCenterRateAction.UpdateDataSourceList[0].ToString()); 

       //Act 
       actual = target.GetCostCentersRates(accountId); 



      //Assert 
      Assert.IsTrue(FindInDataset(costCenterRateId, actual, "ACCOUNTID")); 
     } 
    } 

.....

+0

這是打到某種數據庫後端?如果是這樣 - 哪一個? – RQDQ 2012-02-02 17:26:06

+0

我試圖重新格式化您的代碼的可讀性,並在這樣做時,我發現它沒有任何意義。你正在設置'IsolationLevel'而不是使用它。你已經聲明瞭'範圍',但是沒有使用它。你能直接從IDE中複製代碼,並將其粘貼到問題中。然後突出顯示它並按下「代碼」按鈕。這樣,SO會完全按照它從IDE發出的方式來優化代碼。 – 2012-02-02 17:29:22

+0

我在TransactionScope構造函數上設置隔離級別。 – 2012-02-02 17:36:05

回答

2

對髒讀工作。 就啓動了一個交易(明確) 變更推到數據庫

與READUNCOMMITTED 另一tranasaction選擇數據,你會得到提交的材料爲好。

然後,你要麼回滾或提交你所做的更改交易。

所以從說SQL服務器管理 啓動查詢

Start Transaction 
Insert SomeTable(500) 

啓動另一個查詢

Select * from SomeTable With(READUNCOMMITTED) 

你會看到500條記錄。

試圖弄清楚爲什麼你這樣做是誠實的,斷開的模型ADO.Net使用,除了分佈式事務除外,你不會像這樣測試它們。如果你正在測試的只是插入,就這樣做,聽起來就好像你正在測試實時數據庫,這符合嚴重的壞事。

+0

我們只是想用某些東西來測試我們所有的方法,因爲我們的方法處理數據,在這種情況下我們需要知道,例如,如果select能夠正確地過濾信息。要執行選擇,我們必須模擬插入以確保數據庫中存在實際數據。這隻會在我們的開發(測試)數據庫中完成 – 2012-02-02 17:50:53

+0

好吧,爲什麼你不能將數據提交到測試數據庫。當你混淆了這一點時,你並沒有測試你使用的是什麼。哦,readuncommitted是一個提示,dbms可能會忽略它。 – 2012-02-02 18:07:43

+0

哦,這可能是問題所在。那麼,事情就是遵循命令,我認爲他們最終會把測試放在我們的最終版本上,並用它來確保在編譯版本功能完整時。這就是我們使用事務範圍的原因,所以我們不提交任何內容。現在,我們不需要它,因爲使用測試數據庫,但我想在未來...誰知道。老闆的命令! – 2012-02-02 18:28:26