문서 메뉴
문서 홈
/ / /
EF 핵심 제공자
/

낙관적 동시성을 통한 데이터 일관성 보장

이 페이지의 내용

  • 개요
  • 동시성 토큰
  • 행 버전 관리
  • 제한 사항
  • 추가 정보

이 가이드에서는 EF Core Provider와 함께 낙관적 동시성 제어 를 사용하는 방법을 배울 수 있습니다. 낙관적 동시성 제어는 애플리케이션이 데이터를 읽는 시점과 애플리케이션이 데이터베이스에 데이터를 다시 쓰는 시점 사이에 데이터를 덮어쓰지 않도록 합니다. EF Core Provider는 낙관적 동시성 제어를 구현하는 두 가지 방법을 지원합니다.

  • ConcurrencyCheck 속성 또는 IsConcurrencyToken() 유창한 API 메서드를 사용하여 동시성 토큰

  • Timestamp 속성 또는 IsRowVersion() fluent API 메서드를 사용한 행 버전 관리

엔터티당 위의 구현 중 하나만 사용하여 낙관적 동시성을 보장하는 것이 좋습니다.

동시성 토큰을 사용하여 지정된 속성에 대한 낙관적 동시성을 보장할 수 있습니다. 엔터티를 쿼리할 때 EF Core Provider는 동시성 토큰을 추적합니다. 그런 다음 제공자가 SaveChanges() 또는 SaveChangesAsync() 메서드를 호출하면 데이터베이스에 저장된 동시성 토큰 값을 비교하여 원래 값이 변경되지 않았는지 확인합니다.

클래스를 정의할 때 ConcurrencyCheck 속성을 지정하여 동시성 토큰을 구성할 수 있습니다. 다음 예제에서는 Customer 클래스의 LastModified 속성에 ConcurrencyCheck 속성을 지정하는 방법을 보여 줍니다.

public class Customer
{
public ObjectId Id { get; set; }
public String Name { get; set; }
public String Order { get; set; }
[ConcurrencyCheck]
public DateTimeOffset LastModified { get; set; }
}

IsConcurrencyToken() 메서드를 사용하여 동시성 토큰을 구성할 수도 있습니다. 다음 예제와 같이 DbContext 클래스의 OnModelCreating() 메서드에서 IsConcurrencyToken() 메서드를 호출합니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>()
.Property(p => p.LastModified)
.IsConcurrencyToken();
}

EF Core Provider는 드라이버에서 지원하는 모든 속성 유형에 대한 동시성 토큰 설정을 지원합니다. 단일 엔터티에 여러 동시성 토큰을 설정할 수도 있습니다. 동시성 토큰을 업데이트해야 하는 경우 수동으로 업데이트해야 합니다.

행 버전 관리를 사용하여 낙관적 동시성을 보장할 수 있습니다. 행 버전 관리를 사용하면 엔터티가 변경될 때 자동으로 증가하는 버전 필드를 지정하여 엔터티에 대한 변경 사항을 추적할 수 있습니다. 클래스를 정의할 때 Timestamp 속성을 지정하여 행 버전 관리를 구성할 수 있습니다. 다음 예제에서는 Customer 클래스의 Version 속성에 Timestamp 속성을 지정하는 방법을 보여 줍니다.

public class Customer
{
public ObjectId Id { get; set; }
public String Name { get; set; }
public String Order { get; set; }
[Timestamp]
public long Version { get; set; }
}

IsRowVersion() 메서드를 사용하여 행 버전 관리를 구성할 수도 있습니다. 다음 예제와 같이 DbContext 클래스의 OnModelCreating() 메서드에서 IsRowVersion() 메서드를 호출합니다.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Customer>()
.Property(p => p.Version)
.IsRowVersion();
}

EF Core Provider는 엔터티의 단일 속성에 대해서만 행 버전 관리를 지원합니다. 속성은 long, int, ulong 또는 uint 유형이어야 합니다.

다른 애플리케이션과 데이터를 공유하는 데이터베이스에서 낙관적 동시성 제어를 구성할 때는 다음과 같은 제한 사항을 고려하세요.

  • 다른 애플리케이션은 Entity Framework Core 애플리케이션에서 낙관적 동시성 제어에 사용하는 것과 동일한 메커니즘을 지원해야 합니다.

  • 다른 애플리케이션은 업데이트 또는 삭제 작업 중에 동시성 토큰 및 행 버전 필드에 대한 검사를 지원해야 합니다.

  • 행 버전 관리를 사용하는 경우 다른 애플리케이션은 행 버전이 지정된 필드를 속성 이름 뒤에 오는 문자열에 매핑해야 합니다: _version. 애플리케이션은 업데이트할 때마다 필드 값을 1 씩 증가시켜야 합니다.

Entity Framework Core를 사용한 낙관적 동시성 제어에 대한 자세한 내용은 낙관적 동시성 을 참조하세요. Microsoft Entity Framework Core 문서에서 확인 가능합니다.

돌아가기

MongoDB에 데이터 쓰기