Apa cara yang baik untuk membuat procs yang disimpan cukup kuat sehingga dapat menskala dengan sangat baik dan juga mengandung penanganan kesalahan?
Selain itu, apa cara terbaik untuk menangani beberapa skenario kesalahan dalam proc yang disimpan dan memiliki sistem umpan balik cerdas yang akan mengembalikan informasi kesalahan yang bermakna ke aplikasi panggilan?
Jawaban:
Alex Kuznetsov memiliki bab hebat dalam bukunya Defensive Database Programming (Bab 8) yang mencakup T-SQL TRY ... CATCH, transaksi T-SQL & SET pengaturan XACT_ABORT, dan menggunakan penanganan kesalahan sisi klien. Ini akan banyak membantu Anda dalam memutuskan opsi mana yang paling masuk akal untuk apa yang perlu Anda capai.
Ini tersedia secara gratis di situs ini . Saya sama sekali tidak berafiliasi dengan perusahaan, tetapi saya memiliki versi cetak buku itu.
Ada banyak detail kecil tentang hal ini yang dijelaskan dengan sangat baik oleh Alex.
Per permintaan Nick ... (tetapi tidak semua ini ada di bab ini)
Dalam hal penskalaan, Anda harus jujur secara brutal tentang aktivitas apa yang perlu dalam kode db dan yang harus ada dalam aplikasi. Pernah perhatikan bagaimana kode yang mengeksekusi cepat cenderung kembali merancang untuk satu masalah per metode?
Cara termudah untuk berkomunikasi adalah kode kesalahan khusus (> 50.000). Ini juga cukup cepat. Itu berarti Anda harus tetap menyinkronkan kode db dan kode aplikasi. Dengan kode kesalahan khusus, Anda juga dapat mengembalikan informasi yang berguna dalam string pesan kesalahan. Karena Anda memiliki kode kesalahan khusus untuk situasi itu, Anda bisa menulis parser dalam kode aplikasi yang disesuaikan dengan format data kesalahan itu.
Juga, kondisi kesalahan apa yang perlu coba lagi logika dalam database? Jika Anda ingin mencoba lagi setelah X detik, lebih baik Anda menangani itu dalam kode aplikasi sehingga transaksi tidak terlalu banyak diblokir. Jika Anda hanya mengirim kembali operasi DML segera, mengulanginya di SP bisa lebih efisien. Perlu diingat, bahwa Anda mungkin harus menduplikasi kode atau menambahkan lapisan SPs untuk mencapai coba lagi.
Sungguh, itu saat ini rasa sakit terbesar dengan MENCOBA ... CATCH logika di SQL Server saat ini. Itu bisa dilakukan, tapi itu sedikit omong kosong. Cari beberapa peningkatan yang terjadi pada SQL Server 2012 ini, terutama melemparkan kembali pengecualian sistem (mempertahankan nomor kesalahan asli). Juga, ada FORMATMESSAGE , yang menambahkan beberapa fleksibilitas dalam membangun pesan kesalahan, terutama untuk tujuan pencatatan.
sumber
Ini adalah templat kami (kesalahan logging dihapus)
Catatan:
... jadi jangan membuat lebih banyak TXN daripada yang Anda butuhkan
Namun,
sumber
Saya menggunakan Try / Catch, tetapi saya juga mengumpulkan informasi sebanyak mungkin dan menuliskannya ke errorlog SETELAH rollback. Dalam contoh ini, "LogEvent" adalah prosedur tersimpan yang menulis ke tabel EventLog, yang berisi perincian tentang apa yang terjadi. GetErrorInfo () adalah panggilan fungsi yang mengembalikan pesan kesalahan yang sebenarnya.
Ketika kesalahan terjadi, informasi dikumpulkan, prosedur melompat ke bagian penanganan kesalahan dan mengeluarkan rollback. Informasi tersebut ditulis ke log, kemudian prosedur keluar.
Mempertimbangkan prosedur tambahan / panggilan fungsi yang terlibat, sepertinya sedikit berlebihan. NAMUN metode ini sangat membantu ketika mencoba men-debug masalah.
sumber