MSSQLSERVER_3617

Berlaku untuk:SQL Server

Detail

Atribut Nilai
Nama Produk SQL Server
ID Peristiwa 3617
Sumber Kejadian MSSQLSERVER
Komponen SQLEngine
Nama Simbolis SYS_ATTN
Teks Pesan

Penjelasan

Kesalahan 3617 muncul ketika kueri yang berada di tengah eksekusi dibatalkan oleh aplikasi atau oleh pengguna, atau koneksi rusak. Pembatalan kueri dari aplikasi ini menyebabkan peristiwa Perhatian terjadi di Mesin Database. Peristiwa Perhatian adalah peristiwa SQL Server yang mendaftarkan permintaan aplikasi klien untuk mengakhiri eksekusi kueri. Anda dapat melacak peristiwa Perhatian di sisi SQL Server dengan menggunakan Extended Events atau SQL Trace Attention Event Class. Perhatian muncul secara internal sebagai kesalahan 3617.

Perhatian (pembatalan kueri) adalah salah satu peristiwa TDS paling umum yang ditangani oleh SQL Server. Saat permintaan pembatalan kueri tiba, bit perhatian diatur untuk sesi/permintaan. Saat sesi memproses poin hasil, perhatian diambil dan dihormati. Untuk informasi lebih lanjut tentang perhatian dan bagaimana mereka saling bermain dengan komponen lain lihat Tugas, Pekerja, Utas, Penjadwal, Sesi, Koneksi, Permintaan ; apa artinya?

Tindakan Pengguna

Ringkasan Penyebab:

  • Pastikan kueri selesai dalam durasi yang diharapkan (kurang dari nilai batas waktu kueri yang dikonfigurasi)
  • Meningkatkan kueri atau batas waktu perintah
  • Cari tahu apakah pengguna membatalkan eksekusi kueri secara manual
  • Cari tahu apakah aplikasi atau OS dihentikan secara tak terduga

Pastikan kueri selesai dalam durasi yang diharapkan (kurang dari nilai batas waktu kueri yang dikonfigurasi): Alasan paling umum untuk peristiwa perhatian adalah kueri dihentikan secara otomatis oleh aplikasi karena melebihi nilai batas waktu kueri. Jika nilai batas waktu kueri/commmand diatur ke 30 detik dan kueri tidak mengembalikan bahkan satu paket data kembali ke aplikasi klien, yang terakhir akan membatalkan kueri. Dalam kasus seperti itu, pendekatan terbaik adalah memahami mengapa kueri membutuhkan waktu begitu lama dan mengambil langkah-langkah yang tepat untuk mengurangi durasinya.

Meningkatkan kueri atau batas waktu perintah: Jika Anda menetapkan bahwa kueri yang dibatalkan berjalan dalam durasi garis besar yang telah ditetapkan sebelumnya, tetapi batas waktu perintah masih tercapai, Anda dapat mempertimbangkan untuk meningkatkan nilai batas waktu dalam aplikasi database.

Cari tahu apakah pengguna membatalkan eksekusi kueri secara manual: Dalam beberapa kasus, peristiwa perhatian dapat dinaikkan hanya karena pengguna membatalkan kueri. Dalam kasus seperti itu, mungkin bijaksana untuk menetapkan apakah ekspektasi pengguna melebihi kecepatan kueri yang sebenarnya dan mengatasinya baik dengan menyetel kueri atau mendokumentasikan garis besar yang diharapkan.

Cari tahu apakah aplikasi atau OS menghentikan kueri atau koneksi secara tidak terduga atau apakah aplikasi itu sendiri dihentikan: Selidiki situasi untuk memahami apa yang terjadi di akhir aplikasi. Memeriksa log aplikasi atau Log sistem dapat memberikan petunjuk tentang kemungkinan akar penyebabnya.

Perhatian dan Transaksi

Umumnya, Peristiwa perhatian dimunculkan ketika aplikasi mencapai batas waktu kueri dan membatalkan kueri. Ketika peristiwa Perhatian terjadi, SQL Server tidak secara otomatis mengembalikan transaksi terbuka. Ini adalah tanggung jawab aplikasi untuk mengembalikan transaksi, dan ada beberapa cara umum untuk menangani:

  • Kontrol pembatalan transaksi dengan mengaktifkan SET XACT_ABORT AKTIF saat menyambungkan ke SQL Server. Jika aplikasi tidak melakukan ini, hasil transaksi tanpa intim.

  • Lebih umum, aplikasi menangani kesalahan apa pun dengan menggunakan try.. catch... finally. Di blok coba, Anda membuka transaksi dan jika terjadi kesalahan, gulung balik transaksi dalam tangkapan atau blokir akhirnya.

Ini contohnya:


using (SqlConnection connection = new SqlConnection(sqlConnectionString))
{
    SqlTransaction transaction;
    SqlCommand command = connection.CreateCommand();

    connection.Open();
    transaction = connection.BeginTransaction("UpdateTran_Routine1");


    command.Connection = connection;
    command.Transaction = transaction;


    try
    {
        //update one of the tables 
        command.CommandText = "update dl_tab1 set col1 = 987";
        command.ExecuteNonQuery();
        transaction.Commit();
    }

    catch (SqlException ex)
    {
        // Attempt to roll back the transaction.
        try
        {
            transaction.Rollback();
        }
        catch (Exception ex2)
        {
            // This catch block will handle any errors that may have occurred
            // on the server that would cause the rollback to fail, such as
            // a closed connection.
            Console.WriteLine("Rollback Exception Type: {0}", ex2.GetType());
            Console.WriteLine("  Message: {0}", ex2.Message);
        }
    }
}