sql >> Databasteknik >  >> RDS >> Sqlserver

Optimistisk samtidighet:IsConcurrencyToken och RowVersion

Både i EF6 och EF-core, när du arbetar med SQL Server, måste du använda denna mappning:

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

IsConcurrencyToken konfigurerar en egenskap som samtidighetstoken, men (när den används för en byte[] egendom)

  • datatypen är varbinary(max)
  • dess värde är alltid null om du inte initierar den
  • dess värde ökas inte automatiskt när en post uppdateras.

IsRowVersion å andra sidan,

  • har datatypen rowversion (i SQL Server, eller timestamp i tidigare versioner), så
  • dess värde är aldrig null, och
  • dess värde ökas alltid automatiskt när en post uppdateras.
  • och den konfigurerar automatiskt egenskapen att vara en optimistisk samtidighetstoken.

Nu när du uppdaterar en Car du kommer att se två uppdateringssatser:

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 ...

Den första satsen uppdaterar ingenting, men den ökar radversionen, och den kommer att skapa ett samtidighetsundantag om radversionen ändrades däremellan.

[System.ComponentModel.DataAnnotations.Schema.Timestamp] attribut är dataanteckningarna som motsvarar IsRowVersion() :

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


  1. Hur man uppgraderar från MariaDB 10.4 till MariaDB 10.5

  2. ORA-20001 i R12 Samla schemastatistik på 11g(FND_HISTOGRAM_COLS)

  3. Hur man lagrar UTF8-tecken i MySQL

  4. Oracle Update Query med hjälp av Join