Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Optimistische Parallelität:IsConcurrencyToken und RowVersion

Sowohl in EF6 als auch in EF-Core müssen Sie beim Arbeiten mit Sql Server diese Zuordnung verwenden:

modelBuilder.Entity<Product>() 
.Property(t => t.RowVersion) 
.IsRowVersion(); // Not: IsConcurrencyToken

IstConcurrencyToken konfiguriert zwar eine Eigenschaft als Parallelitätstoken, aber (bei Verwendung für ein byte[] Eigentum)

  • der Datentyp ist varbinary(max)
  • sein Wert ist immer null wenn Sie es nicht initialisieren
  • sein Wert wird nicht automatisch erhöht, wenn ein Datensatz aktualisiert wird.

IstRowVersion andererseits

  • hat den Datentyp rowversion (in SQL Server oder timestamp in früheren Versionen), also
  • sein Wert ist niemals null, und
  • sein Wert wird immer automatisch erhöht, wenn ein Datensatz aktualisiert wird.
  • und es konfiguriert die Eigenschaft automatisch als optimistisches Nebenläufigkeitstoken.

Wenn Sie jetzt ein Car aktualisieren Sie werden zwei Update-Anweisungen sehen:

DECLARE @p int
UPDATE [dbo].[Product]
SET @p = 0
WHERE (([Id] = @0) AND ([Rowversion] = @1))
SELECT [Rowversion]
FROM [dbo].[Product]
WHERE @@ROWCOUNT > 0 AND [Id] = @0

UPDATE [dbo].[Car]
SET ...

Die erste Anweisung aktualisiert nichts, aber sie erhöht die Zeilenversion und löst eine Nebenläufigkeitsausnahme aus, wenn die Zeilenversion zwischenzeitlich geändert wurde.

Der [System.ComponentModel.DataAnnotations.Schema.Timestamp] -Attribut ist das Datenanmerkungsäquivalent von IsRowVersion() :

[Timestamp]
public byte[] RowVersion { get; set; }