EF Core'da rowversion ile eşzamanlılık: JPA @version'dan farkı
Spring Boot'tan EF Core'a geçen bir geliştirici, SQL Server rowversion değerinin JPA @version alanından farklı çalıştığını anlatıyor. Değer veritabanı genelindeki bir sayaçtan üretildiği için satır bazında bir sürüm numarası gibi davranmıyor. Konu, iyimser eşzamanlılık kontrolünü doğru kurmak isteyen .NET geliştiricileri için önemli.
Kilit noktalar
- SQL Server rowversion 8 baytlık, veritabanı genelinde bir sayaçtan üretilen bir değerdir.
- Bir satırın rowversion değeri yalnızca o satır eklendiğinde veya güncellendiğinde değişir.
- EF Core, .IsRowVersion() ile eşleşen sütunu otomatik olarak UPDATE koşuluna ekler.
- Güncelleme sıfır satır etkilerse EF Core DbUpdateConcurrencyException fırlatır.
- JPA @version değeri entity bazında ORM tarafından artırılır; iki mekanizma aynı değildir.
Yazı, JPA/Hibernate'in @version alanı ile EF Core'da SQL Server rowversion kullanımı arasındaki temel farkı ele alıyor. JPA'de sürüm numarası entity bazında ORM tarafından artırılır. SQL Server'da ise rowversion, veritabanı genelinde tek bir sayaçtan türetilen 8 baytlık bir ikili değerdir ve bir satır eklendiğinde ya da güncellendiğinde yeni değer alır. Yazar, bir satırın değerinin başka satırların değişikliklerinden etkilenmediğini, yalnızca kendisi güncellendiğinde değiştiğini örneklerle gösteriyor.
Pratikte EF Core, yüklenen rowversion değerini UPDATE koşuluna ekler. Değer bu arada değişmişse etkilenen satır sayısı sıfır olur ve DbUpdateConcurrencyException fırlatılır. Böylece uygulama çakışmayı yakalayıp kullanıcıya bildirebilir. Makale, bu iki mekanizmanın aynı amaca hizmet ettiğini ama değer üretiminin farklı olduğunu vurguluyor.
Gerçek dünyada kullanımı
- Aynı ürün kaydını birden fazla kullanıcının düzenlediği bir yönetim paneli.
- SQL Server kullanan bir ASP.NET Core API'sinde sipariş veya stok güncellemelerinde kayıp yazmaların önlenmesi.
- Spring Boot'tan .NET'e geçiş yapan ekiplerin eşzamanlılık kurallarını yeniden tasarlaması.
Neden önemli
Rowversion değerini satır sürümü gibi düşünmek yanlış beklentilere yol açar; değer tabloda başka satırların değişikliklerinden de etkilenir. Çakışma yönetimi kodunuzu bu davranışa göre tasarlamanız gerekir.
Benzer haberler
- ASP.NET Core ile POS'ta çift tahsilat ve negatif stoğu tasarımla önlemekDEV Community: #aspnetcore6 gün önce
- SQL Server Msg 1934: QUOTED_IDENTIFIER hatası neden çıkar ve nasıl düzeltilirDEV Community: #dotnet23 Eki
- Odoo'ya lead gönderirken kaybetmemek: ASP.NET Core'da transactional outboxDEV Community: #aspnetcore2 gün önce