Artikel ini adalah artikel cermin dari terjemahan mesin, silakan klik di sini untuk melompat ke artikel aslinya.

Melihat: 45345|Jawab: 5

[Sumber] Pengoptimalan Kueri Kerangka Entitas WITH(NOLOCK)

[Salin tautan]
Diposting pada 06/01/2021 14.52.16 | | | |
Pertama-tama, artikel ini danBukan dengan menambahkan WITH(NOLOCK) untuk meningkatkan performa kueriSebagai gantinya, data dibaca melalui mekanisme isolasi transaksi.

Dalam database SQL Server, ketika tabel database yang sama sering dibaca dan ditulis pada saat yang sama, akan ada masalah kunci, yaitu, Anda tidak dapat membaca hingga transaksi menyisipkan, memperbarui, dan menghapus sebelumnya selesai, dan Anda harus menunggu hingga operasi selesai sebelum Anda dapat melakukan operasi pilih, untuk mencegah operasi bersamaan dan membaca data kotor.

SELECT dengan WITH (NOLOCK) untuk mengatasi kebuntuan pemblokiran.

Nota:Menggunakan WITH(NOLOCK) akan menghasilkan pembacaan data yang kotor

ef menampilkan pernyataan SQL yang dihasilkan
https://www.itsvse.com/thread-3813-1-1.html
Kode pengujiannya adalah sebagai berikut:

Gunakan delegasi Func untuk mengemas kode sebagai berikut:

Pernyataan SQL yang dihasilkan adalah sebagai berikut:

2021-01-06 14:32:09.9505 [ utas] DEBUG DEBUG LogCenter - pernyataan sql: PILIH ATAS (1)
    [Luas1]. [ID] SEBAGAI [ID],
    [Luas1]. [Nama] AS [Nama]
    DARI [dbo]. [Itu] AS [Luas1]
    WHERE ([Extent1].[ Nama] = @p__linq__0) ATAU (([Extent1].[ Name] ADALAH NULL) DAN (@p__linq__0 ADALAH NULL))
2021-01-06 14:32:09.9515 [ utas] DEBUG DEBUG LogCenter - pernyataan sql:

2021-01-06 14:32:09.9525 [ utas] DEBUG DEBUG LogCenter - pernyataan sql: -- p__linq__0: 'itsvse.com' (jenis = string, ukuran = 4000)

2021-01-06 14:32:09.9525 [ utas] DEBUG DEBUG LogCenter - pernyataan sql: -- Dijalankan pada 2021-01-06 14:32:09 +08:00

2021-01-06 14:32:09.9545 [ utas] DEBUG DEBUG LogCenter - pernyataan sql: -- Selesai dalam 1 ms dengan hasil: SqlDataReader

2021-01-06 14:32:09.9555 [ utas] DEBUG DEBUG LogCenter - pernyataan sql:

2021-01-06 14:32:09.9555 [ utas] DEBUG DEBUG LogCenter - pernyataan sql: Koneksi tertutup pada 2021-01-06 14:32:09 +08:00
Pilih kueri tidak menyertakan kata kunci NoLock.

(Akhir)





Mantan:.NET/C# mengimplementasikan pengelogan sederhana berdasarkan BlockingCollection
Depan:Spesifikasi bahasa publik .NET (CLS)
 Tuan tanah| Diposting pada 06/01/2021 14.53.17 |
Gunakan: Tambahkan pernyataan berikut ke Application_Start() Global.cs, dan SQL yang dihasilkan akan secara otomatis ditambahkan dengan(nolock)
//ef命令拦截器
DbInterception.Add(baru DenganNoLockInterceptor());
Jika pernyataan SQL perlu dikunci, tambahkan ekstensi berikut


1. Memperbaiki masalah kesalahan ekspresi reguler yang disediakan di Internet dalam keadaan khusus

 Tuan tanah| Diposting pada 10/01/2021 10.27.32 |
Menguji skrip SQL:

Hasil pengujian:

Tidak ada transaksi yang ditambahkan secara default, dan tingkat isolasi default sudah benar:



Durasi: 17561 milidetik

IsolationLevel.ReadUncommitted tingkat isolasi, seperti yang ditunjukkan pada gambar berikut:



Waktu: 519 ms

Sumber:



 Tuan tanah| Diposting pada 02/05/2023 11.45.35 |
Pengaturan ADO.NET memungkinkan pembacaan kotorBacaTidak Terkomitmenkan, kodenya adalah sebagai berikut:


Ada cara lain untuk menulisnya, kode dapper adalah sebagai berikut:

Tidak ada masalah dengan kedua tes penulisan,Disarankan untuk menggunakan yang pertama secara langsung!!!


Cara lain untuk menulis:



 Tuan tanah| Diposting pada 22/12/2025 13.26.15 |
Microsoft.Data.SqlClient.SqlException (0x80131904): Tabel yang dioptimalkan memori tidak mendukung tingkat isolasi transaksi "READ UNCOMMITTED".
         di Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, pemanggil BooleanHasConnectionLock, Boolean asyncClose)
         di Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady)
         di Microsoft.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString, Boolean isInternal, Boolean forDescribeParameterEncryption, Boolean shouldCacheForAlwaysEncrypted)
         di Microsoft.Data.SqlClient.SqlCommand.CompleteAsyncExecuteReader(Boolean isInternal, Boolean forDescribeParameterEncryption)
         di Microsoft.Data.SqlClient.SqlCommand.InternalEndExecuteNonQuery(IAsyncResult asyncResult, Boolean isInternal, String endMethod)
         di Microsoft.Data.SqlClient.SqlCommand.EndExecuteNonQueryInternal(IAsyncResult asyncResult)
         di 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)

Tingkat isolasi kebocoran SqlTransaction dan TransactionScope(Itu.)Bug telah ada selama 8 tahun, sejauh ini belum diperbaiki! Saya kira banyak orang mungkin terpengaruh tanpa menyadarinya):Login hyperlink terlihat.
Kueri pernyataan SQL pada tingkat isolasi sesi saat ini sebagai berikut:

 Tuan tanah| Diposting pada 23/12/2025 08.53.39 |
Menggunakan ReadUncommitted BeginTransaction dapat menyebabkan pembacaan kotor untuk kueri di luar transaksi:Login hyperlink terlihat.
Saat koneksi ditutup, tingkat isolasi transaksi tidak diatur ulang:Login hyperlink terlihat.
Sanggahan:
Semua perangkat lunak, materi pemrograman, atau artikel yang diterbitkan oleh Code Farmer Network hanya untuk tujuan pembelajaran dan penelitian; Konten di atas tidak boleh digunakan untuk tujuan komersial atau ilegal, jika tidak, pengguna akan menanggung semua konsekuensi. Informasi di situs ini berasal dari Internet, dan sengketa hak cipta tidak ada hubungannya dengan situs ini. Anda harus sepenuhnya menghapus konten di atas dari komputer Anda dalam waktu 24 jam setelah pengunduhan. Jika Anda menyukai program ini, harap dukung perangkat lunak asli, pembelian pendaftaran, dan dapatkan layanan asli yang lebih baik. Jika ada pelanggaran, silakan hubungi kami melalui email.

Mail To:help@itsvse.com