다음을 통해 공유


방법: 도메인 서비스에 명시적 트랜잭션 추가

이 항목에서는 WCF RIA Services 도메인 서비스에서 명시적 트랜잭션을 사용하여 변경 집합이 그룹으로 수행되도록 하는 방법에 대해 설명합니다. DomainContext에 대해 클라이언트에서 SubmitChanges를 호출하면 서버에서 Submit를 호출합니다. 따라서 기본 구현을 사용하여 Submit 메서드를 재정의하고 트랜잭션 코드에 래핑하여 트랜잭션을 사용할 수 있습니다. 그러면 다시 호출된 모든 CUD(Create, Update and Delete) 작업을 종결하는 PersistChangeSet을 호출합니다.

이러한 절차는 POCO(Plain Old XLR Objects)로 정의된 데이터 모델을 사용할 때의 사례와 같이 DomainService 클래스로부터 직접 파생되는 도메인 서비스에 트랜잭션을 통합할 때만 필요합니다. Entity Framework를 사용하여 LinqToEntitiesDomainService에서 도메인 서비스가 파생될 경우 트랜잭션은 자동으로 처리됩니다.

이 항목에 설명된 절차에서는 RIA Services 응용 프로그램이 만들었다고 가정합니다. 이 작업을 수행하는 절차는 연습: RIA Services 솔루션 만들기 항목에서 수행할 수 있습니다.

명시적 트랜잭션을 만들려면

  1. 서버 프로젝트를 마우스 오른쪽 단추로 클릭하고 참조 추가 옵션을 선택하여 참조 추가 창을 엽니다. .NET 탭에서 System.Transactions 어셈블리를 찾아서 선택한 다음 확인을 클릭합니다.

  2. 도메인 서비스에서 Submit 메서드를 재정의합니다.

  3. Submit 메서드의 기본 구현에 대한 호출을 래핑하는 트랜잭션 범위를 만듭니다.

  4. 트랜잭션을 완료하기 전에 ChangeSet 개체의 HasError 속성을 확인합니다.

    다음 예제에서는 도메인 서비스의 명시적 트랜잭션을 보여 줍니다.

    <EnableClientAccess()>  _
    Public Class DomainService1
        Inherits DomainService
    
        Public Overrides Function Submit(ByVal changeSet As System.Web.DomainServices.ChangeSet) As Boolean
            Dim result As Boolean
    
            Using tx = New TransactionScope( _
                    TransactionScopeOption.Required, _
                    New TransactionOptions With {.IsolationLevel = IsolationLevel.ReadCommitted})
    
                result = MyBase.Submit(changeSet)
                If (Not Me.ChangeSet.HasError) Then
                    tx.Complete()
                End If
            End Using
            Return result
        End Function
    End Class
    
    [EnableClientAccess()]
    public class DomainService1 : DomainService
    {
        public override bool Submit(ChangeSet changeSet)
        {
            bool result = false;
    
            using (var tx = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted })
                )
            {
                result = base.Submit(changeSet);
                if (!this.ChangeSet.HasError)
                {
                    tx.Complete();
                }
            }
    
            return result;
        }
    }