낙관적 동시성을 통한 데이터 일관성 보장
개요
이 가이드 에서는 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 애플리케이션 에서 낙관적 동시성 제어 에 사용하는 것과 동일한 메커니즘을 지원 해야 합니다.
다른 애플리케이션은 업데이트 또는 삭제 작업 중에 동시성 토큰 및 행 버전 필드에 대한 검사를 지원 해야 합니다.
행 버전 관리를 사용하는 경우 다른 애플리케이션은 행 버전이 지정된 필드를 속성 이름 뒤에 오는 string(
_version
)에 매핑해야 합니다. 애플리케이션 은 업데이트 할 때마다 필드 값을 1 씩 증가시켜야 합니다.
추가 정보
Entity Framework Core를 사용한 낙관적 동시성 제어 에 대한 자세한 내용은 Microsoft Entity Framework Core 문서에서 낙관적동시성 을(를) 참조하세요.