0

나는 이런 식으로 뭔가를가는 코드가 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

+0

가독성을 위해 코드의 서식을 다시 지정해 보았습니다. 그렇게하면 의미가 없습니다. IsolationLevel을 설정하고 사용하지 않습니다. 당신은'scope'를 선언했지만 그것을 사용하지는 않습니다. IDE에서 직접 코드를 복사하여 질문에 붙여 넣을 수 있습니까? 그런 다음 강조 표시하고 "코드"버튼을 누르십시오. 그렇게하면 SO가 IDE에서 나온 것과 똑같이 코드가 완성됩니다. –

+0

TransactionScope 생성자에 격리 수준을 설정했습니다. –

답변

2

이 일을 읽는 모든 일을합니다. 당신은 트랜잭션을 (명시 적) 데이터를 선택 READUNCOMMITTED 또 다른 tranasaction에서 DB

에 대한 변경 사항을 밀어 시작, 당신은뿐만 아니라 커밋되지 않은 물건을 얻을 수 있습니다.

그럼 당신은 롤백하거나 당신이 변경 한 트랜잭션을 커밋 것 중 하나. 그래서

을 SQL 서버 관리자가 다른 쿼리를 시작

쿼리

Start Transaction 
Insert SomeTable(500) 
를 시작 말에서

Select * from SomeTable With(READUNCOMMITTED) 

500 개의 레코드가 표시됩니다.

연결 해제 된 ADO.Net 모델은 분산 트랜잭션을 제외하고 불필요한 것으로 간주하고 이러한 테스트를하지 않을 것입니다. 테스트하는 모든 것이 인서트 인 경우, 마치 라이브 DB에서 테스트하는 것처럼 들리지만 자격이 심각하게 나쁜 일입니다.

+0

우리의 메서드는 데이터를 처리하기 때문에 우리는 모든 메서드를 테스트하는 방법으로 무언가를 사용하고 싶습니다. 예를 들어, 선택에서 정보를 올바르게 필터링하는 경우를 알아야합니다. select를 실행하려면, 실제 데이터가 데이터베이스에 있음을 보장하기 위해 삽입을 시뮬레이트해야합니다. 이것은 개발 (테스트) 데이터베이스에서만 수행됩니다 –

+0

왜 테스트 데이터베이스에 데이터를 커밋 할 수 없습니까? 당신이 이걸로 엉망으로 만들면서 당신은 어쨌든 당신이 사용하고있는 것을 테스트하지 않습니다. Oh 및 readuncommitted 힌트는 dbms가 무시할 수 있습니다. –

+0

아, 문제 일 수 있습니다. 글쎄, 그건 그냥 명령에 따라 인스턴트 메신저, 나는 그들이 결국 우리의 최종 버전에 테스트를 넣을 것이라고 생각하고 그것을 컴파일 할 때 버전이 완전히 작동하는지 확인하기 위해 사용합니다. 이것이 우리가 트랜잭션 범위를 사용하는 이유입니다. 그래서 우리는 아무것도하지 않습니다. 당분간, 우리는 테스트 데이터베이스를 사용하고 있기 때문에 그럴 필요가 없지만, 미래에는 ... 누가 알 것입니다. 보스의 명령! –

관련 문제