Entity Framework-트랜잭션

모든 버전의 Entity Framework에서 실행할 때마다 SaveChanges()데이터베이스를 삽입, 업데이트 또는 삭제하기 위해 프레임 워크는 트랜잭션에서 해당 작업을 래핑합니다. SaveChanges를 호출하면 컨텍스트가 자동으로 트랜잭션을 시작하고 지속성 성공 여부에 따라 트랜잭션을 커밋하거나 롤백합니다.

  • 이것은 모두 당신에게 투명하며 당신은 그것을 다룰 필요가 없습니다.

  • 이 트랜잭션은 작업을 실행하고 완료 할만큼만 지속됩니다.

  • 다른 작업을 실행하면 새 트랜잭션이 시작됩니다.

Entity Framework 6은 다음을 제공합니다.

Database.BeginTransaction ()

  • 사용자를 위해 트랜잭션을 시작하고 완료하는 기존 DbContext 내에서 간단하고 쉬운 방법입니다.

  • 이를 통해 동일한 트랜잭션 내에서 여러 작업을 결합 할 수 있으므로 모두 커밋되거나 모두 하나로 롤백됩니다.

  • 또한 사용자가 트랜잭션에 대한 격리 수준을보다 쉽게 ​​지정할 수 있습니다.

Database.UseTransaction ()

  • 이를 통해 DbContext가 Entity Framework 외부에서 시작된 트랜잭션을 사용할 수 있습니다.

단일 트랜잭션에서 여러 작업이 수행되는 다음 예제를 살펴 보겠습니다. 코드는-

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         using (var dbContextTransaction = context.Database.BeginTransaction()) {

            try {

               Student student = new Student() {
                  ID = 200, 
                  FirstMidName = "Ali", 
                  LastName = "Khan", 
                  EnrollmentDate = DateTime.Parse("2015-12-1")
               };

               context.Students.Add(student);

               context.Database.ExecuteSqlCommand(@"UPDATE Course SET Title = 
                  'Calculus'" + "WHERE CourseID = 1045");

               var query = context.Courses.Where(c ⇒ c.CourseID == 1045);

               foreach (var item in query) {
                  Console.WriteLine(item.CourseID.ToString()
                     + " " + item.Title + " " + item.Credits);
               }

               context.SaveChanges();
               var query1 = context.Students.Where(s ⇒ s.ID == 200);

               foreach (var item in query1) {
                  Console.WriteLine(item.ID.ToString() 
                     + " " + item.FirstMidName + " " + item.LastName);
               }

               dbContextTransaction.Commit();
            } catch (Exception) {
               dbContextTransaction.Rollback();
            }

         }
      }
   }
}
  • 트랜잭션을 시작하려면 기본 저장소 연결이 열려 있어야합니다.

  • 따라서 아직 열려 있지 않은 경우 Database.BeginTransaction ()을 호출하면 연결이 열립니다.

  • DbContextTransaction이 연결을 연 경우 Dispose ()가 호출 될 때 연결이 닫힙니다.