Bisakah kunci asing menyebabkan kebuntuan dan menghambat BACA SNAPSHOT BERKOMITMEN?

19

Ini adalah pertanyaan lanjutan dari: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automaticallyally

Saya masih mengalami kebuntuan / batas waktu situasi dalam aplikasi ASP.NET ketika menjalankan laporan besar secara bersamaan READ_COMMITTED_SNAPSHOT ON.

Jadi saya punya dua pertanyaan:

  1. Bagaimana saya bisa mengecek apakah Snapshot Level Isolasi Transaksi berfungsi seperti yang diharapkan / sama sekali?
  2. Saya berasumsi bahwa kunci asing (dalam tabel Aplikasi Web ke tabel laporan) bertanggung jawab atas kebuntuan. Saya menemukan artikel yang menarik ini :

Catatan SQL Server memperoleh kunci bersama ketika memvalidasi kunci asing, bahkan jika transaksi menggunakan snapshot yang dilakukan (baca berkomitmen menggunakan versi baris) atau tingkat isolasi snapshot. Perhatikan hal ini ketika memeriksa grafik kebuntuan dari transaksi saat tingkat isolasi transaksi ini digunakan. Jika Anda melihat kunci bersama, periksa untuk melihat apakah kunci diambil pada objek yang dirujuk oleh kunci asing.

Bagaimana saya bisa mengecek jika FK benar-benar bertanggung jawab atas situasi Deadlock / Timeout, apakah itu berarti saya bisa menghapus kunci asing itu untuk mencegah kebuntuan (apa upaya yang bisa diterima)?

Catatan : Saya hanya membaca dari tabel yang menyebabkan kebuntuan.

Setiap pemikiran tentang topik ini sangat dihargai.


Sunting Di sini adalah Deadlock-Graph . Mungkin seseorang bisa membantu saya untuk memahami apa yang menyebabkan kebuntuan. Tampaknya terjadi tanpa laporan yang berjalan hanya disebabkan oleh aplikasi web, ketika dua transaksi ingin menulis tabel yang sama (satu pembaruan dan satu sisipan, sisipannya adalah Stored-Procedure). Mengapa ia memerlukan kunci halaman dan cara mengaktifkan kunci baris saja? Sisipan-SP sudah menggunakan TRANSACTION ISOLATION LEVEL REPEATABLE READ.

Saya memiliki dugaan kuat bahwa dua pemicu (satu pembaruan dan satu masukkan) bertanggung jawab atas kebuntuan. Inilah pemicu sisipan:

CREATE TRIGGER [dbo].[CreateRMAFiDates] 
   ON  [dbo].[RMA] 
   AFTER INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE RMA 
    SET [fiCreationDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
        [fiPopDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
        [fiManufactureDate]=(SELECT idDate FROM tdefDate 
        WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
    FROM INSERTED;
END

Jadi pemicu ini memperbarui RMA-Table apa yang menyebabkan pemicu pembaruan untuk memicu (apa yang mirip). Apakah grafik kebuntuan mengkonfirmasi asumsi saya? Saya pikir saya akan menghapus pemicu tersebut dan membuat SP yang berjalan sekali sehari apa yang akan cukup sempurna, karena kolom ini hanya untuk SSAS-Cube (Molap) saja.

Sunting : Omong-omong, tidak ada jalan buntu lagi karena saya menghapus pemicu ini :)

Tim Schmelter
sumber

Jawaban:

16

Jika tim SQLCAT mengatakan bahwa validasi FK dilakukan dengan menggunakan isolasi yang sudah dibaca, maka mereka harus tahu apa yang mereka bicarakan. Penekanan pada validasi . Pertanyaan sebenarnya adalah Mengapa sebuah laporan memicu validasi FK ? Validasi terjadi saat menulis , dan laporan seharusnya dibaca . Entah laporan Anda yang menyebabkan penulisan, dalam hal ini tingkat isolasi snapshot tidak akan membantu apa pun, baik penyebab kebuntuan berbeda.

Satu-satunya cara untuk membuat kemajuan adalah dengan menangkap grafik deadlock.

Adapun pertanyaan lain, bagaimana Anda bisa memeriksa apakah Anda beroperasi di bawah isolasi snapshot: lihat sys.dm_tran_active_snapshot_database_transactions.

Remus Rusanu
sumber
2

Validasi kunci asing memiliki terjadi di bawah (penguncian) membaca berkomitmen untuk kebenaran. Lihat isolasi Snapshot: Ancaman bagi integritas? oleh Hugo Kornelis untuk detailnya.

Grafik kebuntuan menunjukkan dua eksekusi bersamaan yang RM2.dbo.RMAmenyebabkan kebuntuan. Pemicu Anda tidak memiliki kondisi gabungan antara RMAdan inserted.

Tampaknya ini merupakan pengawasan dan pemicu Anda secara tidak sengaja memperbarui semua baris RMAsehingga kebuntuan sangat mungkin terjadi jika ada lebih dari satu eksekusi pemicu bersamaan.

pengguna126897
sumber