«грязное чтение» не работает во время транзакции, установленной с уровнем изоляции readuncommitted - PullRequest
0 голосов
/ 02 февраля 2012

У меня есть код, который выглядит примерно так:

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"));
        }
    }

.....

1 Ответ

2 голосов
/ 02 февраля 2012

Для грязного чтения, чтобы работать. Вы начинаете транзакцию (явно) нажмите изменения в БД

В очередной транзакции с readuncommitted выберите данные, вы также получите незафиксированные данные.

Тогда вы либо откатитесь, либо подтвердите транзакцию, в которой вы внесли изменения.

Так, скажем, менеджер сервера sql Запустить запрос

Start Transaction
Insert SomeTable(500)

Запустить другой запрос

Select * from SomeTable With(READUNCOMMITTED)

вы увидите 500 записей.

Попытка выяснить, почему вы делаете это, если честно, использует автономная модель ADO.Net, делает ее ненужной, за исключением распределенных транзакций, и вы не будете их тестировать таким образом. Если все, что вы тестируете, это вставки, просто сделайте это, звучит так, как будто вы тестируете на живом БД, что является серьезной ошибкой.

...