1

엔티티 프레임 워크를 사용하여 전체 작업 단위를 수행 한 후에 작업 단위를 구현하고 변경 사항을 커밋하는 방법을 알고 있지만 어떻게해야합니까? 예를 들어, 모두에게 다음과 같은 요구는 내가 모두가 하나의 트랜잭션 내에서 발생하는 데이터베이스 내에서 이메일과 사용자의 절약 보내는 있는지 확인하는 방법을 아주 잘 모르겠어요 하나의 트랜잭션작업 단위/응용 프로그램 서비스 방법 내의 트랜잭션?

CreateUser(...) 
{ 
    //1.) New up user object 
    //2.) Add newly created object to database 
    //3.) Send Email 

    //4.) Commit transaction (ensures email is successfully sent AND object is created in database, else transaction fails 
} 

에서 발생합니다. 조언을 크게 듣습니다.

답변

2

일부 자원은 트랜잭션 방식으로 제공되는 것은 아닙니다. 이메일도 그 중 하나입니다. 따라서 트랜잭션에서 다른 리소스가 실패 할 때 전자 메일 보내기가 롤백되는 것을 기대할 수 없습니다.

일부 대체 솔루션이 있습니다.
1) 마지막 단계에서 비 트랜잭션 리소스를 호출합니다.
사용자 생성 예제에서했던 것처럼. 이 경우 모든 비즈니스 제약 조건을 검사하고 통과합니다. 실패의 유일한 원인은 현실 세계에서 자주 발생하지 않는 인프라 문제입니다 (신중하게 유지 관리해야 함). 인프라 장애가 발생할 경우 약간의 보상을하십시오. 이는 자동 또는 수동으로 수행 할 수 있으며, 발생 빈도에 따라 다릅니다. 예를 들어 전자 메일을 보내지 만 사용자 설정이 롤백 된 경우 매우 유감입니다 (매우 수입 임 : P). 설치에 문제가있어 다시 시도하십시오.

2) 대신 프로세스를 실행하는 데 결국 일관성을

를 사용하여 트랜잭션 자원을 적용합니다. 예를 들어 전자 메일을 보내도록 통보하기 위해 메시징을 사용할 수 있습니다 (2 단계 커밋을 사용하는 경우 전역 적으로 트랜잭션).

CreateUser(...) 
{ 
    //1.) New up user object 
    //2.) Add newly created object to database 
    //3.) Publish user setup event by messaging 

    //4.) Commit transaction (ensures message is successfully sent AND object is created in database, else transaction fails 
    } 

어떤 경우에도 오류와 불일치가 어느 정도 발생합니다. 당신은 그것을 받아 들일 만하다고 평가해야합니다.