Bu makale makine çevirisi ayna makalesidir, orijinal makaleye geçmek için lütfen buraya tıklayın.

Görünüm: 45345|Yanıt: 5

[Kaynak] Entity Framework Sorgu Optimizasyonu WITH(NOLOCK)

[Bağlantıyı kopyala]
Yayınlandı 6.01.2021 14:52:16 | | | |
Öncelikle, bu makale veSorgu performansını artırmak için WITH(NOLOCK) ekleyerek değilBunun yerine, veriler işlemin izolasyon mekanizmasından okunur.

SQL Server veritabanlarında, aynı veritabanı tablosu sık sık aynı anda okunup yazıldığında, bir kilit sorunu ortaya çıkar; yani önceki ekleme, güncelleme ve silme işlemi tamamlanana kadar okuyamazsınız ve eşzamanlı işlemleri önlemek ve kirli veri okumayı önlemek için select işlemini gerçekleştirebilmek için işlem tamamlanana kadar beklemeniz gerekir.

SELECT ifadesi, WITH (NOLOCK) ile bloklama çıkmazını çözebilir.

Not:WITH(NOLOCK) kullanmak kirli veri okumasına yol açar

ef, oluşturulan SQL ifadelerini gösterir
https://www.itsvse.com/thread-3813-1-1.html
Test kodu şu şekildedir:

Kodu aşağıdaki şekilde paketlemek için Func delegate kullanın:

Ortaya çıkan SQL ifadesi şöyledir:

2021-01-06 14:32:09.9505 [ konu] DEBUG DEBUG LogCenter - sql ifadesi: SELECT TOP (1)
    [Kapsam1]. [ID] AS [ID],
    [Kapsam1]. [İsim] AS [İsim]
    [dbo]'dan. [Itsvse] AS [Kapsam1]
    BURADA ([Kapsam1].[ İsim] = @p__linq__0) VEYA (([Kapsam1].[ isim] NULL'DUR) VE (@p__linq__0 NULL'DIR))
2021-01-06 14:32:09.9515 [ konu] DEBUG DEBUG LogCenter - sql ifadesi:

2021-01-06 14:32:09.9525 [ konu] DEBUG DEBUG LogCenter - sql ifadesi: -- p__linq__0: 'itsvse.com' (tür = dize, boyut = 4000)

2021-01-06 14:32:09.9525 [ konu] DEBUG DEBUG LogCenter - sql ifadesi: -- Yürütülüyor: 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ konu] DEBUG DEBUG LogCenter - sql ifadesi: -- 1 ms'de tamamlandı ve sonuç: SqlDataReader

2021-01-06 14:32:09.9555 [ konu] DEBUG DEBUG LogCenter - sql ifadesi:

2021-01-06 14:32:09.9555 [ konu] DEBUG DEBUG LogCenter - sql statement: Bağlanmış bağlantı 2021-01-06 14:32:09 +08:00
Select Query, NoLOCK anahtar kelimesini içermez.

(Son)





Önceki:.NET/C#, BlockingCollection tabanlı basit logları uygular
Önümüzdeki:.NET (CLS) kamu dili spesifikasyonu
 Ev sahibi| Yayınlandı 6.01.2021 14:53:17 |
Kullan: Global.cs'nin Application_Start() ifadesine aşağıdaki ifadeyi ekleyin, oluşturulan SQL otomatik olarak (nolock) ile ekler
//ef命令拦截器
DbInterception.Add(yeni WithNoLockInterceptor());
SQL ifadesinin kilitlenmesi gerekiyorsa, aşağıdaki uzantıyı ekleyin


1. Özel koşullar altında internette sunulan düzenli ifadelerin hata problemi çözüldü

 Ev sahibi| Yayınlandı 10.01.2021 10:27:32 |
SQL scriptlerini test etmek:

Test sonuçları:

Varsayılan olarak işlem eklenmez ve varsayılan izolasyon seviyesi doğrudur:



Süre: 17561 milisaniye

IsolationLevel.ReadUncommitted isolation level, aşağıdaki görselde gösterildiği gibi:



Süre: 519 ms

Kaynak:



 Ev sahibi| Yayınlandı 2.05.2023 11:45:35 |
ADO.NET ayarları kirli okumaya izin verirReadUncommitted, kod şöyledir:


Başka bir şekilde yazılabilir, dapper kodu şöyledir:

Her iki yazım testinde de sorun yok,İlkini doğrudan kullanmanız önerilir!!!


Yazmanın diğer yolları:



 Ev sahibi| Yayınlandı 22.12.2025 13:26:15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Bellek optimize edilmiş tablolar, işlem izolasyon seviyesi "OKUMA KARARSIZ" desteğini sağlamaz.
         at Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose)
         at Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
         at Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
         at Microsoft.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(Boolean isInternal, Boolean forDescribeParameterEncryption)
         at Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, String endMethod)
         at Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         at Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryAsync(IAsyncResult asyncResult)
         at System.Threading.Tasks.TaskFactory'1.FromAsyncCoreLogic(IAsyncResult iar, Func'2 endFunction, Action'1 endAction, Task'1 promise, Boolean requiresSynchronization)

SqlTransaction ve TransactionScope sızıntı izolasyon seviyeleri(The.)Hata 8 yıldır var, şimdiye kadar tamir edilmedi! Sanırım birçok insan farkında olmadan etkilenebilir):Bağlantı girişi görünür.
SQL ifadesini mevcut oturum izolasyon seviyesinde aşağıdaki şekilde sorgulayın:

 Ev sahibi| Yayınlandı 23.12.2025 08:53:39 |
ReadUncommitted BeginTransaction kullanımı, işlem dışı sorgularda kirli okumalara neden olabilir:Bağlantı girişi görünür.
Bağlantı kapalı olduğunda, işlem izolasyon seviyesi sıfırlanmaz:Bağlantı girişi görünür.
Feragatname:
Code Farmer Network tarafından yayımlanan tüm yazılım, programlama materyalleri veya makaleler yalnızca öğrenme ve araştırma amaçları içindir; Yukarıdaki içerik ticari veya yasa dışı amaçlarla kullanılamaz, aksi takdirde kullanıcılar tüm sonuçları ödemelidir. Bu sitedeki bilgiler internetten alınmakta olup, telif hakkı anlaşmazlıklarının bu siteyle hiçbir ilgisi yoktur. Yukarıdaki içeriği indirmeden sonraki 24 saat içinde bilgisayarınızdan tamamen silmelisiniz. Programı beğendiyseniz, lütfen orijinal yazılımı destekleyin, kayıt satın alın ve daha iyi orijinal hizmetler alın. Herhangi bir ihlal olursa, lütfen bizimle e-posta yoluyla iletişime geçin.

Mail To:help@itsvse.com