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