sql >> Database teknologi >  >> RDS >> Sqlserver

Optimistisk samtidighed:IsConcurrencyToken og RowVersion

Både i EF6 og EF-core, når du arbejder med SQL Server, skal du bruge denne kortlægning:

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

IsConcurrencyToken konfigurerer en egenskab som samtidighedstoken, men (når den bruges til en byte[] ejendom)

  • datatypen er varbinary(max)
  • dens værdi er altid null hvis du ikke initialiserer den
  • dens værdi øges ikke automatisk, når en post opdateres.

IsRowVersion på den anden side,

  • har datatypen rowversion (i SQL Server eller timestamp i tidligere versioner), så
  • dens værdi er aldrig null, og
  • dens værdi øges altid automatisk, når en post opdateres.
  • og den konfigurerer automatisk egenskaben til at være et optimistisk samtidighedstoken.

Nu når du opdaterer en Car du vil se to opdateringsudsagn:

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ørste sætning opdaterer ikke noget, men den øger rækkeversionen, og den vil give en samtidighedsundtagelse, hvis rækkeversionen blev ændret i mellemtiden.

[System.ComponentModel.DataAnnotations.Schema.Timestamp] attribut er dataanmærkningerne svarende til IsRowVersion() :

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


  1. Kan en Android-app oprette forbindelse direkte til en online mysql-database

  2. Sådan tilføjes Meridiem-indikatoren (AM/PM) til en tidsværdi i Oracle

  3. postgresql-sekvens nextval i skema

  4. Sådan opdateres flere kolonner i MySQL