2017-02-08 1 views
3

죄송합니다. 복제 된 경우 너무 많이 검색했지만 일치하는 질문을 찾지 못했습니다.한 트랜잭션에서 동일한 유형의 여러 집계 인스턴스를 업데이트 할 수 있습니까?

하나의 트랜잭션에서 여러 집계 인스턴스를 업데이트하지 말아야한다는 것을 알고 있습니다. 그러나 여기서 "다중 집계 인스턴스"는 다른 집계 유형의 여러 인스턴스를 의미한다고 생각합니다. 내가 맞습니까?

말, 제품BacklogItem는는 두 개의 서로 다른 집계, 그래서 우리는 하나의 거래에 모두 제품 및 BacklogItem를 업데이트하지 않도록해야합니다.

그러나 동일한 집계 유형의 인스턴스를 여러 개 업데이트해야하는 경우 어떻게해야합니까? 예, 제품의 이름을 모두 업데이트해야합니다. 가장 좋은 방법은 무엇입니까?

의사는

//Application Service 
public void ChangeTitle(string newName) 
{ 
    using(uow.BeginTransaction()) 
    { 
     IEnumerable<Product> products = repo.GetAll(); 
     foreach(var product in products) 
     { 
      product.ChangeName(newName); 
     } 
    } 
} 
+0

아니요, 할 수 없습니다. 이 작업을 수행해야하는 경우 집계의 경계가 잘못되었습니다. –

+0

@ ConstantinGALBENU 꼭 그렇지는 않습니다. 강력한 일관성을 위해 규칙과 트레이드 확장 성을 위반하는 것이 허용 될 수있는 경우가 있습니다. – plalx

답변

3

AR의 종류는 무관하다, 액세스 라우터는 항상 트랜잭션 경계입니다. 그들 중 다수와 함께 일할 때는 보통 부분적인 실패와 궁극적 인 일관성을 받아 들여야합니다.

모든 AR을 통해 보호 할 불변량이 없으면 왜 모든 이름 바꾸기가 실패하거나 성공해야합니다. 예를 들어 사용자 인터페이스에서 사용자가 한 번에 여러 제품의 이름을 바꿀 수 있고 일부 사용자가 수백 가지 이름을 바꿀 수있는 경우 예를 들어 동시성 충돌로 인해 한 제품의 이름을 바꾸지 못하면 제품의 이름을 변경하거나 사용자 중 하나가 실패했다는 사실을 사용자에게 알리지 않는 것이 좋습니다.

항상 규칙을 위반할 수 있지만 트랜잭션과 관련된 AR이 많을수록 동시성 충돌로 인해 트랜잭션 실패가 발생할 가능성이 높다는 것을 이해해야합니다 (경합이 발생할 수 있다고 가정 할 경우).

보통 AR 경계를 넘어서는 불변량이있을 때만 하나의 트랜잭션에서 여러 개의 AR을 수정하기 때문에 궁극적 인 일관성을 피할 수 있습니다.

0

안내 이유는 동시 액세스에 대한 기대와 관련됩니다. 한 번에 시스템에 접속 한 사용자 수에 따라, 더 많은 것을, 하나의 트랜잭션, 동시 변경의 더 많은 위험에 변경이있는 것 중 하나

  • 원인 오류 또는 동시성 위반하는 경우로 인해 예외 당신 때문에 당신이 동시성 관리를

이 지침을 사용하지 않는 경우 비관적 동시성 관리를

  • 원인 데이터 일관성 문제를 사용하는 경우 잠금에 낙관적 동시성 관리를
  • 원인 지연을 사용하여 적용 여부 t의 크기 변화하는 윙윙 소리는 더 넓어지고 (더 많은 유형의 집계 변경) 또는 더 깊어집니다 (동일한 집계의 더 많은 인스턴스 변경). 변화하는 부분을 정확히 고려하기보다는이 변경의 일부분이 다른 사람이 동시에 변경하는 것과 충돌 할 위험은 무엇입니까?

    고도의 동시 다중 사용자 시스템을위한 DDD 설계는 작은 독립 집계를 설계하는 지침이 나오는 곳입니다. 이것이 귀하의 경우가 아니라면 잠재적 위험 분석을 바탕으로 지침을 위반할 수 있습니다.

  • 0

    집계는 트랜잭션 경계를 보호하는 데 사용됩니다. 의사 코드에서 볼 수있는 것부터 모두 하나의 트랜잭션으로 변경하고 있습니다.

    하나의 트랜잭션으로 수행해야하는 이유가 있습니까? 그렇다면 모델에 개념이 누락 된 것처럼 보입니다. 이 개념은 도메인의 여러 집계를 업데이트하고 모든 것이 성공적으로 완료되었을 때 다시보고하는 간단한 프로세스 관리자 일 수도 있습니다. 업데이트 중 하나에서 실패 할 경우 일부 재시도 메커니즘이나 다른 예외 처리를 통합 할 수도 있습니다. 이 프로세스 관리자는 '일괄 renamer'또는 그와 비슷한 이름을 지정할 수 있습니까?

    업데이트 할 집계의 모든 도메인 이벤트 소비자로 등록한 후 (잠재적으로 병렬로) 집계의 이름을 업데이트 한 다음 유지합니다 도메인 이벤트를 청취합니다. 모든 이벤트가 수신되면 모든 집계의 이름 변경이 끝났음을보고하고 예외 처리를 수행 할 수 있습니다.

    관련 문제