Transaction 처리에 대해서...

שאלה Transaction 처리에 대해서...

  • 2012년 5월 2일 수요일 오전 3:03
     
     

    MVC 3 위에서 EF 4.1 을 사용하고 있습니다.
     
    기본적으로 Azure 에서는 DTC 가 지원되지 않는 것으로 알고 있고,
     
    Transaction 을 DTC 로 승격시키지 않기 위해서는 EF 4.1 에서는

    수동으로 열고 닫는 처리를 해줘야 하는 것으로 알고 있습니다.
     
    참고 URL : http://msdn.microsoft.com/ko-kr/library/bb896325.aspx

    음.. 질문 내용은...
     
    SQL 2008 에서 테이블을 만들어 놓고,
     
    비주얼스튜디오 2010 에서 "ADO.NET 엔티디 데이터 모델" 추가를 하고,
     
    프로젝트 내에서 컨트롤 추가로 CRUD 를 매핑 후....
     
    Controllers 내에서...
     
    [HttpPost]
     public ActionResult Create(tbl_GuestBookTest tbl_guestbooktest)
     {
          if (ModelState.IsValid)
          {
               using (TransactionScope scope = new TransactionScope())
               {
                    try
                    {
                         tbl_guestbooktest.GUID = Guid.NewGuid().ToString();
     
                        db.tbl_GuestBookTest.AddObject(tbl_guestbooktest);
                         db.SaveChanges();
     
                        /// scope.Complete();
                    }
                    catch
                    {
                         // do nothing
                    }
               }
     
              return RedirectToAction("Index"); 
         }
          return View(tbl_guestbooktest);
     }
     
    이런 방식으로 트랜잭션 테스트를 수행해보니, Commit 과 Rollback 은 잘됩니다.
     
    그런데, DTC 로 승격을 방지하려면,
     
    엔티티 모델 추가된것과는 별도로 수동으로 Open / Close 에 대한 처리를 해줘야 하는 것인지요?
     
    ( 참고 URL : http://social.msdn.microsoft.com/Forums/is/adodotnetentityframework/thread/c3fd7555-7fff-44b8-8e1e-030073c20597 )

    추가된 엔티티모델의 partial class 내에서 public myObjectEntities() : base("name=myObjectEntities", "myObjectEntities") 와 같이

    Connection 이 자동으로 연결이 됩니다만, 이 경우 DTC 로 자동 승격이 되버리는 지요?
     
    만약에 그렇다면 DTC 자동 승격을 방지하기 위해서,
     
    Base 에서 Connection 을 제거하고,

    using (var context = new MyContext())
     {
          using (var txscope = new TransactionScope())
          {
               context.Connection.Open();
     
              // do query 1
               // do query 2
          }
     }
     
    이런 방식으로 메소드 내에서 컨텍스트 별로 Open 에 대한 처리를 따로 해줘야 하는 것인지요?
     
    ------------------------------------------------------
     
    검색을 계속 하면서 테스트를 수행해보고 있습니다만...
     
    엔티티모델 추가부터 트랜잭션 처리 , DTC 승격 방지 처리까지 정리된 내용을 찾기가 쉽지 않네요...
     
     감사합니다.

    • 편집됨 MahoMay 2012년 5월 2일 수요일 오전 3:04
    •  

모든 응답

  • 2012년 5월 7일 월요일 오전 5:50
    중재자
     
     
    안녕하십니까? MaHoMay 님
    Microsoft TechNet의 Forum 사이트를 방문해 주셔서 감사합니다.
     
    고객님께서 문의하신 내용은 트랙킹중에 있습니다. 답답하시겠지만,  조금만 기다려주시면 답변을 올리 겠습니다.
     
    제가 문제에 대해 더 알아야 할 것이 있다면 응답 주시면 감사하겠습니다.
  • 2012년 5월 8일 화요일 오전 8:18
    중재자
     
     

    안녕하십니까? MahoMay 님,
    Microsoft MSDN의Forum 사이트를 방문해 주셔서 감사합니다.

    현재 문의 하신 ”Transaction 처리에 대해서..." 대해 답변을 드리겠습니다.

    아래와 같이 연결을 수동으로 연 다음 쿼리를 실행하고 변경 내용을 저장합니다.컨텍스트가 범위를 벗어나서 삭제되면 연결이 닫히도록 구현부탁드립니다

    ' Define the order ID for the order we want.
    Dim orderId As Integer = 43680

    Using context As New AdventureWorksEntities()
        ' Explicitly open the connection.  연결
        context.Connection.Open()

        ' Execute a query to return an order. 실행
        Dim order As SalesOrderHeader = context.SalesOrderHeaders.Where("it.SalesOrderID = @orderId", _
                                            New ObjectParameter("orderId", orderId)).Execute(MergeOption.AppendOnly).First()


        ' Change the status of the order. 실행완료값 대입
        order.Status = 1

        ' Save changes. 정상적으로 처리시 오픈된 connection 종료
        If 0 < context.SaveChanges() Then
            Console.WriteLine("Changes saved.")
        End If
        ' The connection is closed when the object context
        ' is disposed because it is no longer in scope.
    End Using


    [참조자료]
    방법: 수동으로 개체 컨텍스트의 연결 열기(Entity Framework)

    제시해 드린 답변이 도움이 되었기를 바랍니다.

    답변이 문제 해결에 도움이 되었다면 답변으로 채택을 부탁드립니다.
    하지만 문제 해결이 되지 않아서 정확한 답변을 원하는 경우에는 문제의 정보를 더 자세하게 답변으로 제공해주시기 바랍니다.