sql >> Databáze >  >> RDS >> Sqlserver

Optimistická souběžnost:IsConcurrencyToken a RowVersion

V EF6 i EF-core musíte při práci se SQL Serverem použít toto mapování:

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

IsConcurrencyToken nakonfiguruje vlastnost jako token souběžnosti, ale (při použití pro byte[] vlastnost)

  • datový typ je varbinary(max)
  • jeho hodnota je vždy null pokud jej neinicializujete
  • jeho hodnota se při aktualizaci záznamu automaticky nezvyšuje.

IsRowVersion na druhou stranu

  • má datový typ rowversion (na serveru SQL Server nebo timestamp v dřívějších verzích), takže
  • jeho hodnota není nikdy nulová a
  • jeho hodnota se vždy automaticky zvýší při aktualizaci záznamu.
  • a automaticky nakonfiguruje vlastnost jako optimistický token souběžnosti.

Nyní, když aktualizujete Car uvidíte dvě prohlášení o aktualizaci:

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

První příkaz nic neaktualizuje, ale inkrementuje verzi řádku a vyvolá výjimku souběžnosti, pokud byla mezitím změněna verze řádku.

[System.ComponentModel.DataAnnotations.Schema.Timestamp] atribut je ekvivalent datových poznámek k IsRowVersion() :

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


  1. Jak spustit SHOW LOCALES v MariaDB

  2. Jak najít položku seznamu na zadané pozici v MySQL

  3. Základy tabulkových výrazů, část 8 – CTE, úvahy o optimalizaci pokračovaly

  4. mysqli::query():Nelze načíst mysqli