낙관적 동시성을 통한 데이터 일관성 보장
개요
이 가이드에서는 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; } [ ] 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; } [ ] 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 문서에서 확인 가능합니다.