Bildiğiniz gibi Entity Framework'ün oluşturduğu sorgular ekstra bir ayar yapmazsanız, varsayılan olarak NOLOCK parametresi olmadan oluşturuluyor. Ancak özellikle büyük çaplı projelerde, saniyede onlarca CRUD işleminin yapıldığı tablolarda NOLOCK olmadan çalışmak büyük performans kayıplarına yol açabiliyor.
Peki Entity Framework ile NOLOCK içeren sorgular nasıl oluşturuyoruz derseniz, cevabımız TransactionScope. IsolationLevel'ini ReadUncommitted olarak ayarladığımız yeni bir TransactionScope yaratıp, sorgumuzu bunun içinde oluşturuyoruz.
using (var context = new Entities())
{
TransactionOptions transactionOptions = new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted };
using (var transaction = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
var result = context.TableName;
}
}
Burada dikkat etmemiz gereken tek bir nokta var, eğer
SQL Server Profiler ile incelerseniz bu oluşturduğumuz sorgunun
NOLOCK içermediğini göreceksiniz. Yaptığımız işlemin etkisini sorgumuzdan hemen önceki satırda göreceğiniz
Audit Login'in muhtemelen son satırında göreceğiniz
"set transaction isolation level read uncommitted" satırında göreceksiniz. Yani yarattığımız bu transaction boyunca, sunucuya atacağımız bütün sorgular
NOLOCK parametresini içeriyormuş gibi davranacak.
Sonuç olarak
NOLOCK içeren sorgular yaratmak bir iki satır fazla kod yazmaktan geçiyor. Peki alternatif yollar yok mu? Efektif bir çözüm olmasa da, dilerseniz
NOLOCK içeren
Stored Procedure'ler yazıp
Entity Framework'den
Funciton olarak bu SP'leri çağırabilirsiniz.