INF: Menganalisis dan menghindari deadlock dalam SQL Server

Terjemahan Artikel Terjemahan Artikel
ID Artikel: 169960 - Melihat produk di mana artikel ini berlaku.
Perbesar semua | Perkecil semua

Pada Halaman ini

RINGKASAN

Microsoft SQL Server mempertahankan integritas transaksional dan database konsistensi dengan menggunakan kunci. SQL Server versi 6.5 opsional menggunakan baris- tingkat penguncian untuk memasukkan operasi dan menggunakan halaman-tingkat penguncian lain operasi. Dengan sistem database relasional, mengunci dapat mengakibatkan deadlock antara pengguna.

Misalnya, User1 (atau Connection1) memiliki kunci pada item data "A" dan ingin kunci pada item data "L." User2 memiliki kunci pada item data "B" dan sekarang ingin kunci pada item data "A." Dalam skenario SQL Server ini, baik User1 atau User2 akan menjadi korban kebuntuan, dan pengguna lain akan diberikan kunci yang diminta.

Dalam SQL Server, pengembang aplikasi dapat memutuskan sambungan yang akan menjadi kandidat untuk korban kebuntuan dengan menggunakan SET DEADLOCK_PRIORITY. Jika pengembang tidak menetapkan prioritas untuk deadlock, memilih SQL Server korban kebuntuan dengan memilih proses yang melengkapi bundar rantai kunci.

Sistem aplikasi database dapat berperilaku berbeda ketika porting dari salah satu database relasional yang lain, didasarkan pada pelaksanaan sistem database relasional. Salah satu wilayah untuk mencari perubahan perilaku penguncian. Artikel ini menjelaskan cara menganalisa deadlock di SQL Server dan teknik yang dapat digunakan untuk menghindari mereka.

INFORMASI LEBIH LANJUT

Artikel ini menekankan menggunakan output dari jejak bendera T1204 untuk menganalisis deadlock. Ketika jejak bendera T1204 diatur, SQL Server mencetak informasi tentang kebuntuan ketika itu terjadi. Untuk menggunakan bendera jejak, menggunakan perintah berikut pada prompt perintah untuk mulai SQL Server:
   sqlservr -c -T1204
				

Hasil jejak dikirim ke jendela konsol, kecuali jika Anda mengatur bendera jejak T3605, yang mengirim output jejak log kesalahan.

Deadlock dapat terjadi ketika dua koneksi memperbarui tabel agar berlawanan. Sebagai contoh, satu sambungan memasukkan ke meja "example1" pertama dan kemudian ke "example2," sementara menyisipkan koneksi lain ke meja "example2" pertama dan kemudian menjadi "example1" dalam transaksi. Contoh skenario berguna untuk menggambarkan bagaimana menghindari deadlock.

Berikut ini adalah pernyataan SQL yang digunakan untuk membuat tabel yang digunakan untuk ini contoh:
   create table example1 (column1 int, column2 char(20), column3 char(50))
   go
   create table example2 (column1 int, column2 char(20), column3 char(50))
   go
   declare @lvar int
   select @lvar = 0
   while @lvar < 500
   begin
   insert into example1 values (@lvar, 'AAA', 'CCC')
   insert into example2 values (@lvar, 'AAA', 'CCC')
   select @lvar = @lvar + 1
   end
   go
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
   create unique clustered index ex2ind1 on example2 (column1, column2)
   with fill factor = 90, PAD_INDEX
   go
				

Contoh 1: Tabel insersi agar berlawanan

Dalam contoh ini, dua tabel yang dimasukkan ke dalam urutan yang berlawanan dan jalan buntu terjadi. Deadlock juga dapat terjadi ketika dua atau lebih koneksi melakukan Update atau menghapus meja agar berlawanan.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
				

Pada titik ini, Connection1 mungkin memblokir Connection2 karena baris Connection2 memasukkan Mei menjadi pada halaman yang sama di mana Connection1 memiliki sudah dimasukkan berturut-turut dan yang memegang kunci.
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Pada titik ini, Connection2 mungkin memblokir Connection1, karena baris Connection1 memasukkan Mei menjadi pada halaman yang sama di mana Connection2 memiliki sudah dimasukkan berturut-turut dan yang memegang kunci. Hal ini menyebabkan kebuntuan.

Berikut adalah output untuk jejak bendera 1204 ketika kebuntuan terjadi:
97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES (100,
     'AAAA', 'CCC')
   spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (200,
   'AAAB', 'CCC')
   VICTIM: spid 13, pstat 0x0000 , cputime 30
				

Setiap baris kebuntuan jejak dapat memberitahu pengguna lebih lanjut tentang jalan buntu. Connection1 spid 13 dan Connection2 spid 14 (Anda dapat menentukan spid terkait dengan koneksi dengan menggunakan sistem sp_who yang disimpan prosedur).
   >> 97/04/20 11:51:57.88 spid13   *** DEADLOCK DETECTED with spid 14 ***
   The deadlock was detected between spid 13 and spid 14.
   >> spid 13 requesting EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 14, dbid 6, page 0x188, table example2, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example2 VALUES
   (100, 'AAAA', 'CCC')
				

Spid 13 meminta EX_PAGE kunci dan diblokir oleh spid 14, yang sudah memiliki EX_PAGE kunci untuk halaman 0x188 di meja example2 di dbid 6. The kunci diadakan pada halaman milik berkerumun indeks.
      Indid Value         Description
-------------------------------------
         0                Data page if there is no clustered index, or the
                          leaf page of a clustered index if there is one
         1                Non-leaf page of the clustered index page
       255                Text/image page
    Any other value       Non-clustered secondary index
				

Perintah saat ini dijalankan oleh spid 13 adalah MENYISIPKAN dan jejak memberikan bagian dari buffer masukan.
   >> spid 14 waiting for EX_PAGE (waittype 0x8005), blocked by:
   >>   EX_PAGE: spid 13, dbid 6, page 0x180, table example1, indid 0x1
   >>   pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES
   (200, 'AAAB', 'CCC')
				

Spid 14 adalah menunggu EX_PAGE kunci dan diblokir oleh spid 13, yang sudah memegang kunci EX_PAGE pada halaman yang sama.
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

Berikut adalah penjelasan tentang apa yang berarti dalam berbagai kunci jejak:

SH_INT dan EX_INT
Maksud kunci yang diambil pada tingkat yang lebih tinggi item (misalnya, tabel) sebelum tingkat rendah kunci (misalnya, halaman) dapat diambil, karena Lock manager menyadari hubungan antara berbagai jenis item (dalam kasus ini, halaman dan tabel). Jika EX_INT kunci tidak diambil Tabel sebelum mengambil EX_PAG kunci halaman, pengguna lain dapat mengambil EX_TAB kunci pada tabel yang sama dan manajer kunci tidak akan tahu bahwa konflik ada. Saat ini, SQL Server memiliki maksud kunci hanya pada tabel. Ada dua jenis maksud kunci: bersama (SH_INT) dan eksklusif (EX_INT) kunci.

EX_PAGE
Ini adalah kunci halaman eksklusif yang diambil ketika halaman diperbarui karena DELETE, UPDATE, atau masukkan pernyataan dengan menyisipkan baris-tingkat penguncian (IRL) dinonaktifkan.

UP_PAGE
Ini adalah pembaruan halaman kunci yang mengambil tempat dari halaman bersama kunci Ketika sebuah halaman di-scan dan Pengoptimal tahu bahwa halaman akan Diperbarui (atau petunjuk UPDLOCK digunakan).

PR_EXT, NX_EXT, UPD_EXT, dan EX_EXT
Kunci ini diambil ketika mengalokasikan atau deallocating ruang disk. UPD_EXT diambil ketika mengalokasikan atau deallocating halaman dari ada rupa dan yang lain yang digunakan ketika mengalokasikan atau deallocating extent seluruh.

IX_PAGE dan LN_PAGE
Ini adalah kunci IRL. IX_PAGE adalah maksud-untuk-lakukan-baris-penguncian kunci pada halaman. LN_PAGE diambil ketika halaman yang IRL sedang dilakukan kebutuhan untuk dibagi.

RLOCK dan XRLOCK
Kunci jangka pendek ini diambil ketika melintasi indeks b-pohon. Ada dua jenis jenis kunci: bersama (RLOCK) dan eksklusif (XRLOCK). Bersama kunci diambil selama pemindaian, sementara kunci eksklusif diambil Indeks halaman selama update.

EX_TAB
Ini adalah eksklusif tabel kunci yang terjadi ketika Pengoptimal SQL Server menentukan bahwa tabel scan adalah cara yang paling efisien untuk memecahkan update permintaan (misalnya, ketika tidak ada indeks di atas meja). EX_TAB kunci juga muncul ketika Anda mengunci meja dengan TABLOCKX atau ketika SQL Server meningkat kunci halaman di atas meja untuk tabel kunci.

SH_TAB
Ini adalah meja bersama kunci yang digunakan ketika Pengoptimal mengasumsikan bahwa sebagian besar dari tabel akan dipindai (atau halaman penguncian meningkat) atau TABLOCK petunjuk digunakan.

Contoh kebuntuan sebelumnya dapat dihindari jika koneksi dua update tabel dalam urutan berikut:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (200, 'AAAB', 'CCC')
   Connection2 > INSERT INTO example2 VALUES (200, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Contoh 2: Insersi bagian-bagian yang berbeda dari meja yang sama

Kebuntuan ini juga dapat terjadi ketika dua koneksi masukkan ke berbeda bagian dari meja yang sama agar berlawanan ketika baris berbagi halaman. Untuk contoh:
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > INSERT INTO example1 VALUES (400, 'AAAA', 'CCC')
				

Dalam tabel contoh ini, ada indeks berkerumun di kolom pertama Tabel example1. Baris dengan nilai yang sama untuk kolom pertama akan cenderung jatuh pada halaman yang sama. Dalam contoh, baris kedua dimasukkan oleh Connection1 akan mungkin jatuh pada halaman yang sama dengan baris pertama yang dimasukkan oleh Connection2, karena mereka berdua memiliki nilai indeks berkerumun 400. Ini menyebabkan Connection2 blok Connection1.
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

Sekarang Connection2 juga dapat diblokir oleh Connection1, mengarah ke jalan buntu. Berikut ini adalah jejak kebuntuan:
   97/04/20 12:56:01.40 spid16   *** DEADLOCK DETECTED with spid 15 ***
   spid 16 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 15, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (100,
   'AAAB', 'CCC')
   spid 15 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 16, dbid 6, page 0x8bd, table example1, indid 0
     pcurcmd INSERT(0xc3), input buffer: INSERT INTO example1 VALUES (400,
   'AAAA', 'CCC')
   VICTIM: spid 16, pstat 0x0000 , cputime 130
				

Spid 16 permintaan untuk EX_PAGE kunci untuk halaman 0x2c5 diblokir oleh spid 15, yang sudah memegang EX_PAGE kunci untuk halaman 0x2c5 setelah itu pertama Masukkan. Dan spid 15 juga punya diblokir oleh spid 16 pada menunggu EX_PAGE kunci untuk halaman 0x8db mengarah ke kebuntuan.

Kebuntuan ini dapat dihindari dengan menggunakan perintah berikut untuk mengaktifkan IRL untuk tabel example1:
   sp_tableoption 'example1', 'insert row lock', true
				

Contoh 3: Insersi menggunakan IRL

IRL memungkinkan dua atau lebih pengguna untuk berbagi halaman ketika mereka hanya memasukkan operasi, yang sering mengakibatkan throughput yang lebih baik. Namun, memungkinkan IRL tidak akan selalu mengurangi deadlock. Dalam beberapa kasus, IRL dapat memperkenalkan deadlock.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

Dengan IRL diaktifkan, koneksi kedua akan memegang kunci IX_PAGE pada halaman mengandung dua baris baru. Jika IRL dinonaktifkan, Connection1 akan memperoleh EX_PAGE kunci, dan Connection2 akan diblokir segera.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Pada titik ini, Connection2 kebutuhan eksklusif halaman kunci untuk melakukan UPDATE pernyataan, yang bertentangan dengan Connection1's IX_PAGE kunci. Oleh karena itu, Connection2 akan menunggu.
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

Sekarang Connection1 mungkin diblokir oleh Connection2, mengarah ke jalan buntu. The Berikut ini adalah jejak kebuntuan:
   97/04/20 15:13:50.07 spid17   *** DEADLOCK DETECTED with spid 18 ***
   spid 17 requesting UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 18, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 100 and column2 = 'AAAA'
   spid 18 waiting for UP_PAGE (waittype 0x8007), blocked by:
     IX_PAGE: spid 17, dbid 6, page 0x2c5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   VICTIM: spid 17, pstat 0x0000 , cputime 20
				

Spid 17 (koneksi satu) menunggu untuk UP_PAGE kunci, yang pertama langkah untuk mendapatkan halaman eksklusif kunci. Itu diblokir oleh spid 18, yang memegang kunci IX_PAGE di halaman 0x2c5. Spid 18 adalah menunggu UP_PAGE kunci pada halaman yang sama, dan diblokir oleh IX_PAGE kunci dipegang oleh spid 17. Ini mengarah ke jalan buntu karena IX_PAGE kunci sharable, sedangkan UP_LOCK ini tidak. Selama penyisipan pertama, kedua spids mendapat IX_PAGE kunci Halaman yang sama, dan kemudian mereka mencoba untuk meng-upgrade kunci untuk UP_PAGE kunci, yang ini tidak mungkin karena UP_PAGE kunci eksklusif.

Salah satu cara untuk menghindari kebuntuan adalah untuk memasukkan nilai diperbarui secara langsung ke dalam tabel alih-alih memasukkan dan kemudian memperbarui baris yang sama transaksi. Jika hal ini tidak mungkin, menggunakan perintah berikut untuk menonaktifkan IRL akan membantu untuk menghindari kebuntuan:
   sp_tableoption 'example1', 'insert row lock', false
				

Contoh 4: Insersi untuk baris pada halaman yang sama

Kebuntuan juga dapat menyebabkan ketika baris spids dua bekerja pada tapi berbeda termasuk halaman yang sama.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 405
   and column2 = 'AAAA'
				

Pada titik ini, Connection1 mungkin diblokir oleh Connection2. Situasi ini dapat terjadi karena Connection1 ingin memperbarui sebuah baris pada halaman di mana Connection2 sudah dimasukkan berturut-turut.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Pada titik ini, Connection2 juga dapat diblokir oleh Connection1, yang akan menyebabkan kebuntuan. Situasi ini dapat terjadi ketika Connection2 ingin memperbarui sebuah baris pada halaman di mana Connection1 telah menyisipkan baris. Berikut ini adalah jejak kebuntuan:
   97/04/20 15:48:21.18 spid20   *** DEADLOCK DETECTED with spid 19 ***
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x2c4, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 105 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0xc48, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 405 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 60
				

Kebuntuan ini dapat dihindari dengan menyebar keluar baris atas berbeda Halaman. Salah satu metode untuk melakukan ini adalah untuk menciptakan kembali indeks berkerumun di tabel ini dengan faktor besar mengisi. Berikut adalah pernyataan yang menciptakan indeks berkerumun dengan faktor mengisi 50 persen:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

Pernyataan ini menciptakan indeks berkerumun meninggalkan setengah halaman kosong, termasuk tingkat non-daun indeks berkerumun (karena PAD_INDEX pilihan). Tabel menempati dua kali lipat ukuran sebenarnya, dan jumlah baris per halaman adalah setengah dari apa yang mereka itu.

Faktor mengisi tidak dikelola di atas meja; Tabel re-organized dengan faktor tertentu mengisi hanya selama waktu penciptaan indeks. Seiring waktu, baris per halaman akan berubah dari faktor mengisi ditentukan selama indeks penciptaan. Ketika ini terjadi, mungkin ide yang baik untuk menciptakan kembali Indeks berkerumun dengan faktor mengisi yang diinginkan.

Solusi lain untuk menghindari situasi buntu sebelumnya adalah untuk pad tabel dengan boneka kolom (misalnya, dummy1 char(255)). Hal ini meningkatkan ukuran baris dan menyebabkan lebih sedikit baris per halaman (hanya satu baris per Halaman). Karena jenis padding dipertahankan dari waktu ke waktu, Anda tidak perlu untuk menciptakan kembali indeks berkumpul untuk mempertahankan padding (meskipun Anda mungkin ingin kembali menciptakan indeks berkumpul untuk alasan lain). The kelemahan dari teknik ini adalah ruang penyimpanan yang terbuang pada dummy bidang.

Contoh 5: Padding baris

Padding baris mengarah ke lebih sedikit baris per halaman (oleh karena itu lebih sedikit deadlock), tetapi tidak akan benar-benar menghapus deadlock.

Dalam tabel contoh ini, example1 bantalan menduduki satu baris per halaman. The Berikut ini adalah pernyataan yang digunakan untuk membuat tabel untuk contoh ini:
   create table example1 (column1 int, column2 char(20), column3 char(50),
   dummy_column4 char (255), dummy_column5 char (255), dummy_column6 char
   (255))
   go
   create unique index ex1ind5 on example1 (column3, column2, column1,
   dummy_column4, dummy_column5, dummy_column6) with fill factor = 85
   go
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (400, 'AAAB', 'CCC', ' ', ' ',
   ' ', ' ')
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 401
   and column2 = 'AAAA'
				

Pada titik ini, Connection1 diblokir oleh Connection2 sementara memperbarui baris. Karena SQL Server harus mempertahankan rantai-halaman petunjuk, mengunci Halaman sebelumnya, halaman berikutnya, dan halaman yang sedang diperbarui. Karena Connection2 memegang kunci pada halaman sebelumnya, Connection1 harus menunggu sampai Connection2 melakukan transaksi.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

Pada titik ini, Connection2 diblokir oleh Connection1 karena itu harus mengunci Halaman sebelumnya, yang dikunci oleh Connection1. Hasilnya adalah jalan buntu. Berikut ini adalah jejak kebuntuan:
   spid 20 requesting UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 19, dbid 6, page 0x12b5, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCB' where column1 = 101 and column2 = 'AAAB'
   spid 19 waiting for UP_PAGE (waittype 0x8007), blocked by:
     EX_PAGE: spid 20, dbid 6, page 0x1531, table example1, indid 0
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCA' where column1 = 401 and column2 = 'AAAA'
   VICTIM: spid 20, pstat 0x0000 , cputime 300
				

Kebuntuan ini dapat dihindari dengan memasukkan boneka baris antara baris yang yang dimasukkan, diperbarui, atau dihapus. Sebagai contoh, jika Connection1 bekerja (memasukkan, update, atau menghapus) dengan baris pk = 1 dan Connection2 bekerja dengan baris pk = 5, memasukkan berturut-turut antara ini dua baris (seperti berturut-turut mengandung pk = 3) akan menghindari deadlock. Metode ini juga meningkatkan Ukuran meja, tapi mungkin menjadi solusi terbaik untuk mereka antrian tabel penting untuk aplikasi.

Contoh 6: Nonclustered indeks

Dalam beberapa kasus, non-berkumpul Indeks sekunder dapat memperkenalkan deadlock. Dalam contoh ini, pemeliharaan Indeks sekunder memperkenalkan kebuntuan.

Berikut adalah pernyataan yang digunakan untuk membuat Indeks sekunder yang digunakan dalam contoh ini:
   create index ex1ind2 on example1 (column3) with fill factor = 90,
   PAD_INDEX
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCBA', ' ', '
   ', ' ', ' ')
   Connection2 > INSERT INTO example1 VALUES (300, 'AAAB', 'CCCZ', ' ', '
   ', ' ', ' ')
   Connection2 > UPDATE example1 SET column3 = 'CCBA' where column1 = 105
				

Pada titik ini, Connection2 mungkin diblokir oleh Connection1 karena Connection1 mungkin memegang kunci pada halaman indeks sekunder non-berkumpul di mana Connection2 kebutuhan untuk memperbarui.
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

Pada titik ini, Connection1 mungkin diblokir oleh Connection2, yang mengakibatkan kebuntuan. Situasi ini dapat terjadi ketika Connection1 menunggu kunci untuk memperbarui non-berkumpul Indeks sekunder di mana Connection2 telah dimasukkan dan memegang kunci pada halaman tersebut. Berikut ini adalah jejak kebuntuan untuk contoh kebuntuan ini:
   97/04/20 19:05:38.75 spid11   *** DEADLOCK DETECTED with spid 12 ***
   spid 11 requesting EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 12, dbid 6, page 0x112f, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCCZ' where column1 = 305
   spid 12 waiting for EX_PAGE (waittype 0x8005), blocked by:
     EX_PAGE: spid 11, dbid 6, page 0x1108, table example1, indid 0x2
     pcurcmd UPDATE(0xc5), input buffer: UPDATE example1 SET column3 =
   'CCBA' where column1 = 105
   VICTIM: spid 11, pstat 0x0000 , cputime 50
				

Kebuntuan ini dapat dihindari dengan menjatuhkan Indeks sekunder. Tidak mungkin untuk pad indeks mengandung satu baris per halaman, jadi situasi ini dapat dihindari hanya dengan menghilangkan non-berkumpul Indeks sekunder atau oleh memodifikasi aplikasi.

Deadlock dapat terjadi dengan lebih dari dua koneksi, dalam hal kebuntuan jejak daftar spids terlibat dalam kebuntuan dan juga kunci bertentangan. Deadlock dapat terjadi dengan kunci RLOCK dan XRLOCK, yang Diperoleh selama indeks melintasi. Deadlock juga dapat terjadi karena sejauh kunci (PR_EXT, NX_EXT, UPD_EXT & EX_EXT).

Untuk informasi tambahan tentang menganalisis deadlock, Anda dapat mengaktifkan Bendera jejak berikut:

T1200
Cetakan semua informasi permintaan/rilis kunci ketika itu terjadi, apakah kebuntuan terlibat atau tidak. Ini mahal dalam hal kinerja, tetapi dapat berguna untuk analisis.

T1206
Cetakan semua kunci yang dipegang spids berpartisipasi dalam kebuntuan.

T1208
Cetakan nama host dan nama program yang disediakan oleh klien. Ini dapat membantu mengidentifikasi klien yang terlibat dalam jalan buntu, dengan asumsi klien menentukan nilai unik untuk setiap sambungan.

Properti

ID Artikel: 169960 - Kajian Terakhir: 15 September 2011 - Revisi: 2.0
Berlaku bagi:
  • Microsoft SQL Server 6.5 Standard Edition
Kata kunci: 
kbhowto kbusage kbmt KB169960 KbMtid
Penerjemahan Mesin
PENTING: Artikel ini diterjemahkan menggunakan perangkat lunak mesin penerjemah Microsoft dan bukan oleh seorang penerjemah. Microsoft menawarkan artikel yang diterjemahkan oleh seorang penerjemah maupun artikel yang diterjemahkan menggunakan mesin sehingga Anda akan memiliki akses ke seluruh artikel baru yang diterbitkan di Pangkalan Pengetahuan (Knowledge Base) dalam bahasa yang Anda gunakan. Namun, artikel yang diterjemahkan menggunakan mesin tidak selalu sempurna. Artikel tersebut mungkin memiliki kesalahan kosa kata, sintaksis, atau tata bahasa, hampir sama seperti orang asing yang berbicara dalam bahasa Anda. Microsoft tidak bertanggung jawab terhadap akurasi, kesalahan atau kerusakan yang disebabkan karena kesalahan penerjemahan konten atau penggunaannya oleh para pelanggan. Microsoft juga sering memperbarui perangkat lunak mesin penerjemah.
Klik disini untuk melihat versi Inggris dari artikel ini:169960
Sanggahan Konten KB yang Tidak Lagi Diperbarui
Artikel ini berisi tentang produk yang tidak lagi didukung oleh Microsoft. Oleh karena itu, artikel ini disajikan ?sebagaimana adanya? dan tidak akan diperbarui.

Berikan Masukan

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com