INF: Çözümleme ve SQL Server'da kilitlenmeleri önleme

Makale çevirileri Makale çevirileri
Makale numarası: 169960 - Bu makalenin geçerli olduğu ürünleri görün.
Hepsini aç | Hepsini kapa

Bu Sayfada

Özet

Microsoft SQL Server, kilitler kullanarak işlem bütünlüğünü ve veritabanı tutarlılık sağlar. Isteğe bağlı SQL Server sürüm 6.5 ekleme işlemlerinde satır düzeyinde kilitleme kullanır ve diğer işlemler için sayfa düzeyinde kilitleme kullanır. Herhangi bir ilişkisel veritabanı sistemi gibi kilitleme kilitlenmeleri için kullanıcılar arasında neden olabilir.

Örneğin, Kullanıcı1'ı (veya Connection1) kilit sahip olduğunu varsayın veri "A" madde ve kilit veri madde "B" istemektedir. Kullanıcı2 kilit veri madde "B" var ve artık bir veri öğesi "A." kilitlendiğinde istemektedir. SQL Server bu senaryoda, Kullanıcı1'ı veya kullanıcı2 kilitlenme kurbanı olacaktır ve başka bir kullanıcı, istenen kilit verilir.

SQL Server'da uygulama geliştiricisi, hangi bağlantı kilitlenme kurbanı için aday SET DEADLOCK_PRIORITY kullanarak olması karar verebilirsiniz. Geliştirici kilitlenmeleri için bir öncelik belirlemek, SQL Server kilitlenme kurbanı kilitlerinin döngüsel zincirdeki tamamlar işlem seçerek seçer.

Veritabanı uygulaması sistemleri davranabilir farklı ilişkisel bir veritabanından diğerine, bağlantı noktası kurulmuş bir ilişkisel veritabanı sistem uygulamasına zamanlarına. Davranış değişikliklerini aramak için bu alanların bir kilitleme. Bu makalede, SQL Server ve bunları engellemek için kullanabileceğiniz teknikler kilitlenmeleri çözümlenecek açıklar.

Daha fazla bilgi

Bu makalede, kilitlenmeleri çözümlemek üzere izleme bayrağı T1204 çıkışını kullanarak vurgular. Izleme bayrağı T1204 ayarladığınızda, oluştuğunda, SQL Server kilitlenme bilgilerini yazdırır. Bu izleme bayrağı'nı kullanmak için <a0></a0>, SQL Server'ı başlatmak için komut isteminde aşağıdaki komutu kullanın:
   sqlservr -c -T1204
				

Takip çıktısı için hata günlüğünü gönderen T3605, izleme bayrağı ayarlamadıysanız, izleme sonuçları konsol penceresi için gönderilir.

Kilitlenmeler, iki bağlantı ters sırada bir tablo güncelleştirdiğinizde oluşabilir. Örneğin, "example2" ilk tabloyu ve sonra "example1" bir işlem içinde başka bir bağlantı ekler, ancak tek bir bağlantıda "example1" ilk tabloyu ve sonra "example2," ekler. Bir örnek senaryoyu kilitlenmeleri nasıl göstermek yararlıdır.

Bu örnek için kullanılan tablo oluşturmak için kullanılan SQL ifadelerini şunlardır:
   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
				

Örnek 1: Tablo eklemeler ters sırası

Bu örnekte, iki tablo ters sırada eklenmiş ve bir kilitlenme oluştu. Kilitlenmeleri de iki oluşabilir veya daha fazla bağlantı tablolarda ters sırada güncelleştirmeleri veya silmeleri gerçekleştirin.
   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')
				

Bu noktada, burada Connection1 satır zaten eklenmiş ve kilit tutan aynı sayfada olduğundan Connection2 ekleme satırı Connection1 Connection2 engelleyebilir.
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

Bu noktada Connection1 ekleme satırı Connection2 satır zaten eklenmiş ve kilit tutan aynı sayfada olduğundan Connection2 Connection1, engelleyebilir. Bu, bir kilitlenmeye neden olur.

Izleme bayrağı, kilitlenme oluştu 1204 için çıkışı aşağıdadır:
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
				

Kilitlenme izleme her satır, kullanıcıların anlarsınız kilitlenme hakkında daha fazla. Connection1 spid 13 ve Connection2 spid 14 (sp_who</a1> Sistem saklı yordamını kullanarak, bir bağlantıyla ilişkili spid belirleyebilir).
   >> 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 EX_PAGE kilit isteğinde ve tablo example2 0x188 sayfasında EX_PAGE kilitlensin, 6 dbid içinde zaten varsa, 14 spid tarafından engellenmiş. Kilit, kümelenmiş bir dizine ait sayfasında tutulur.
      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
				

13 SPID tarafından yürütülen komutun geçerli INSERT, izleme giriş arabelleği bölümünü verir.
   >> 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 EX_PAGE kilitlensin beklemektedir ve zaten EX_PAGE kilit, aynı sayfada tutar, 13 spid tarafından engelleniyor.
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

Bir açıklama izleme içinde çeşitli kilit anlamı şudur:

SH_INT ve EX_INT
Kilit Yöneticisi arasındaki farklı türde bir öğe (Bu durumda, sayfaları ve tabloları) uyumlu olduğu için üst düzey öğede (örneğin, bir tablo), alt düzey (örneğin, sayfa) kilitlenmeden önce alınır hedefi kilitlerin alınabilir. Bir EX_INT kilit tabloyu EX_PAG kilitlerin sayfalarda götürmeden önce yapılmadı değil, aynı tabloda başka bir kullanıcı bir EX_TAB kilit ele geçirebilir ve kilit Yöneticisi, bir çakışma varolduğunu bilmez. Şimdilik, SQL Server tabloları üzerinde hedefi kilitlerin yoktur. Hedefi kilitlerin iki tür vardır: paylaşılan (SH_INT) ve <a1>Özel</a1> (EX_INT) kilitler.

ex_page
Bu bir DELETE nedeniyle UPDATE güncelleştirilen bir sayfa ya da içeren bir INSERT deyimi eklemek devre dışı (IRL), satır düzeyinde kilitleme alınmış bir özel sayfa kilidi olur.

up_page
Bunun yerine paylaşılan sayfa kilidi alınan bir sayfayı taranan ve sayfa güncelleştirilecektir iyileştirici biliyor güncelleştirme sayfa kilidi ise (veya UPDLOCK ipucu kullanılır).

PR_EXT NX_EXT, UPD_EXT ve EX_EXT
Bu kilit, ayırma veya disk alanı ayırmayı kaldırma alınır. UPD_EXT ayrılırken veya sayfa ayırmayı kaldırma, varolan bir uzantı alınır ve diğerlerinden ayırmak veya tüm kapsamları ayırmayı kaldırma kullanılır.

IX_PAGE ve LN_PAGE
Bunlar, IRL kilitler. Bir sayfanın amacı için--satır-kilitleme kilitlendiğinde IX_PAGE var. LN_PAGE olduğunda, IRL bölünmesi gereken yapılır bir sayfa olarak alınır.

RLOCK ve XRLOCK
Bu kısa süreli kilit dizini b-ağaç geçme zaman alınır. Bu tür bir kilit iki vardır: paylaşılan (RLOCK) ve <a1>Özel</a1> (XRLOCK). Paylaşılan kilitler, tarama sırasında özel kilit, güncelleştirme sırasında dizin sayfalarında alındığı sırada alınır.

ex_tab
SQL Server iyileştirici, bir tablo taraması için bir güncelleştirme sorgusu (örneğin, tablo üzerinde dizin olduğunda) çözmenin en etkin yolu olduğunu belirlediğinde oluşan bir özel tablo kilidi olmasıdır. Tablo TABLOCKX ipucu veya SQL Server için bir tablo kilidi olan bir tabloyu sayfa kilitlerin korsanlıktan kilitlediğinizde EX_TAB kilitleri de görünür.

sh_tab
Bu bir paylaşılıyorsa iyileştirici tablosunda, çoğunu varsayar nakledilirken kullanılan tablo kilidi taranacak (veya sayfa kilitleme korsanlıktan) veya TABLOCK ipucu kullanılır.

Önceki örnekte kilitlenme iki bağlantıları aşağıdaki sırada tabloları güncelleştirirseniz kaçınılması:
   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')
				

Örnek 2: Aynı tablo, farklı bölümleri eklemeler

Satır, sayfalar paylaştırdığınızda iki bağlantı farklı bölümlerini ters sırayla aynı tablonun taktığınızda, bu kilitlenme da oluşabilir. Örneğin,:
   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')
				

Bu örnek tablo <a0>example1</a0> tablonun ilk sütunu kümelenmiş bir dizin yok. Ilk sütunun aynı değerlere sahip satırlar aynı sayfaya düşen eğilimindedir. Her ikisi de 400 kümelenmiş dizin değeri olduğundan örnekte, ikinci satır Connection1 tarafından eklenen büyük olasılıkla Connection2 tarafından eklenen ilk satırı olarak aynı sayfa üzerinde kalan. Bu bloğu Connection1 Connection2 neden olur.
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

Şimdi Connection2 de kilitlenme için önde gelen bir Connection1 tarafından engelleniyor olabilir. Kilitlenme izleme şudur:
   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
				

<a1>Sayfa</a1> 0x2c5 EX_PAGE kilitlensin spid 16 isteği ilk ekleme olduğu sonra önceden <a1>sayfanın</a1> 0x2c5 EX_PAGE kilit tutan spid tarafından 15 engellendi. Ve 15 spid de kilitlenme için 16 spid EX_PAGE kilit 0x8db sayfanın satır aralığı için beklemek üzerinde tarafından engellenen.

Bu kilitlenme IRL için tablo example1 etkinleştirmek için aşağıdaki komutu kullanarak kaçınılması:
   sp_tableoption 'example1', 'insert row lock', true
				

Örnek 3: Eklemeler IRL kullanma

Bunlar yalnızca işlemleri eklediğinizde, sayfayı paylaşmak, iki veya daha fazla kullanıcı IRL; genellikle daha iyi iş çıkarma yeteneğini verir. Ancak, IRL etkinleştirme her zaman kilitlenmeleri azaltacaktır değil. Bazı durumlarda, IRL kilitlenmeleri zayıflığına neden olabilir.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

Etkin IRL ile hem de bağlantılarını, iki yeni satır içeren bir sayfada bir IX_PAGE kilit tutacaktır. IRL devre dışı bırakıldıysa Connection1 bir EX_PAGE kilit alınmış ve Connection2 hemen engellenmiş.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Bu noktada Connection2 Connection1'ın IX_PAGE kilit ile uyumsuz bir UPDATE deyimi yapmak için bir özel sayfa kilidi gerekir. Bu nedenle, Connection2 bekleyecektir.
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

Şimdi Connection1 Connection2, kilitlenme için önde gelen tarafından engelleniyor olabilir. Kilitlenme izleme şudur:
   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
				

Bir özel sayfa kilidi alınıyor ilk adımı bir UP_PAGE kilit spid 17 (bağlantı biri) bekliyor. Sayfada 0x2c5 IX_PAGE kilit tutan, 18 spid tarafından engelleniyor. Spid 18 UP_PAGE kilitlensin aynı sayfada beklemektedir ve 17 spid tarafından tutulan IX_PAGE kilidi tarafından engelleniyor. UP_LOCK değildir; oysa IX_PAGE kilit paylaştırılabilir, çünkü bu bir kilitlenme için müşteri adayı. Ilk ekler sırasında hem spids IX_PAGE kilit aynı sayfada aldım ve daha sonra kilidi UP_PAGE kilit özel olduğundan, olası değil UP_PAGE kilidi, yükseltme denediniz.

Kilitlenme önlemek bir tabloya ekleme ve daha sonra aynı işlemde satır güncelleştirme yerine doğrudan güncelleştirilmiş değeri eklemek için yoludur. Bu mümkün değilse, IRL devre dışı bırakmak için aşağıdaki komutu kullanarak kilitlenme önlemek için yardımcı olacaktır:
   sp_tableoption 'example1', 'insert row lock', false
				

4. Örnek: Aynı sayfa üzerinde satırları eklemeler

Iki spids, üzerinde çalıştığınız satır farklıdır, ancak aynı sayfaya ait de BIR kilitlenmeye neden olabilir.
   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'
				

Bu noktada Connection1 Connection2 tarafından engelleniyor olabilir. Burada satır Connection2 önceden eklenen sayfasında satır güncelleştirme Connection1 istediği için bu durum oluşabilir.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

Bu noktada Connection2 de için bir kilitlenmeye neden ve Connection1 tarafından engelleniyor olabilir. Burada, bir satır Connection1 ekledi sayfasında satır güncelleştirme Connection2 istediğinde, bu durum oluşabilir. Kilitlenme izleme şudur:
   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
				

Bu kilitlenme üzerinde farklı bir sayfa satırlar yayarak kaçınılması. Bunu yapmak için bir kümelenmiş dizini bu tablodaki büyük bir dolgu etmeni ile yeniden yöntemidir. Bir deyimi ile yüzde 50'lik bir dolgu etmeni kümelenmiş bir dizin oluşturur şudur:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

Bu ifade, yarısı sayfaları boş (PAD_INDEX seçeneği nedeniyle) kümelenmiş dizin Yaprak olmayan düzeylerini de dahil olmak üzere bırakarak kümelenmiş bir dizin oluşturur. Tablo boyutunun iki katı kapladığı; sayfa başına satır sayısı, alınan yarısını.

Bir tabloda dolgu etmeni korunur; bu tabloyu yalnızca dizin oluşturma sırasında ile belirtilen bir dolgu etmeni re-organized saattir. Zaman içinde sayfa başına satır dizini oluşturulurken belirtilen dolgu etmeni değiştirecek. Bu durumda, istediğiniz dolgu etmeni ile kümelenmiş dizini yeniden oluşturmak için iyi bir fikir olabilir.

Önceki kilitlenme durumu önlemek için başka bir tabloyla birlikte boş sütunlar (örneğin, dummy1 char(255)). yazma çözümdür Bu satırın boyutunu artırır ve daha az satır / sayfa (sayfa başına bir satır olarak birkaç gibi) için müşteri adayları. Bu tür bir doldurma zamanla tutulduğundan, (kümelenmiş dizin, başka bir nedenle yeniden oluşturmak isteyebilirsiniz, ancak) doldurma korumak için bir kümelenmiş dizini yeniden oluşturmanız gerekmez. Bu teknik dezavantajı depolama alanı boş alanları harcanan emin olur.

Örnek 5: Satır doldurma

Sayfa başına daha az satır için satır doldurma adaylarının (dolayısıyla daha az kilitlenmeleri), ancak onu tamamen kilitlenmeleri ortadan kaldırır..

Bu örnek tablo sayfa başına bir satır kaplamasına example1 boşluklarla. Bu örnek tablo oluşturmak için kullanılan deyimler şunlardır:
   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'
				

Bu noktada, Connection1 satır güncelleştirilirken Connection2 tarafından engellendi. SQL Server sayfasını zinciri işaretçileri korumak gerekir çünkü önceki sayfaya, bir sonraki sayfada ve güncelleştirilen sayfa kilitler. Connection2 önceki sayfada kilit tutan çünkü Connection2 hareketi tamamlar Connection1 beklemeniz gerekir.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

Bu noktada, önceki sayfaya Connection1 tarafından şu anda kilitli kilitleme gerekir çünkü Connection2 Connection1 tarafından engellendi. Kilitlenme sonucudur. Kilitlenme izleme şudur:
   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
				

Bu kilitlenme, güncelleştirilmiş ya da silinmiş eklenmekte satırları arasına boş satır ekleyerek kaçınılması. Connection1 satır pk ile (ekleme, güncelleştirmeleri veya silmeleri) çalışıyorsa, 1 satır pk Connection2 yarar = ve = 5, bu iki satır arasındaki bir satır ekleme (pk içeren bir satır gibi = 3) kilitlenmeleri önlemek. Bu yöntem ayrıca tablonun boyutunu artırır, ancak bu uygulama için kritik sıra tabloları için en iyi çözüm olabilir.

Örnek (6): Kümelenmemiş dizin

Bazı durumlarda, ikincil dizinlerin kümelenmemiş kilitlenmeleri zayıflığına neden olabilir. Bu örnekte, ikincil dizin bakım kilitlenme tanıtır.

Bu örnekte kullanılan ikincil bir dizin oluşturmak için kullanılan deyimi şudur:
   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
				

Bu noktada Connection1 kilit ikincil kümelenmemiş dizin sayfasında Connection2 güncelleştirmesi gereken tutan, çünkü Connection2 Connection1 tarafından engelleniyor olabilir.
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

Bu noktada, Connection1 bir kilitlenmeyle kaynaklanan bir Connection2 tarafından engelleniyor olabilir. Connection1 Connection2 önceden eklenen ve bu sayfada bir kilit tutan kümelenmemiş ikincil dizini güncelleştirmek bir kilitleme bekleniyor, bu durum oluşabilir. Kilitlenme izleme bu kilitlenme örnek aşağıda verilmiştir:
   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
				

Ikincil dizin bırakarak bu kilitlenme engellenmesi. Bu nedenle, bu durum yalnızca kümelenmemiş ikincil dizin ortadan kaldırarak veya değiştirerek uygulama baþlatýlarak, sayfa başına bir satır içeren dizin için yazma mümkün değildir.

Kilitlenmeler, ikiden fazla bağlantıları ile kilitlenme izleme, kilitlenme ve ayrıca çakışan kilitleri dahil olan spids durumda listeler oluşabilir. Dizine geçiş yapma sırasında alınan RLOCK ve XRLOCK kilitlerin kilitlenmeleri oluşabilir. Kilitlenmeler, uzantının kilitler (PR_EXT NX_EXT, UPD_EXT & EX_EXT) nedeniyle de oluşabilir.

Kilitlenme çözümlemesi hakkında daha fazla bilgi için aşağıdaki izleme bayraklarını etkinleştirebilirsiniz:

T1200
Bu hata oluştuğunda, veya bir kilitlenmeyle ilgili olup olmadığını tüm kilitleme isteği/sürüm bilgileri yazdırır. Bu performans açısından pahalıdır, ancak çözümlemesi için yararlı olabilir.

T1206
Kilitlenme, katılımcı spids tarafından tutulan kilitlerin tümü yazdırır.

T1208
Ana bilgisayar adı ve istemci tarafından sağlanan program adını yazdırır. Bu durum, istemcinin bir kilitlenmeyle ilgili istemci, her bağlantı için benzersiz bir değer belirtir varsayarak tanımlar yardımcı olabilir.

Özellikler

Makale numarası: 169960 - Last Review: 16 Ekim 2003 Perşembe - Gözden geçirme: 3.0
Bu makaledeki bilginin uygulandığı durum:
  • Microsoft SQL Server 6.5 Standard Edition
Anahtar Kelimeler: 
kbmt kbhowto kbusage KB169960 KbMttr
Machine-translated Article
ÖNEMLİ: Bu makale, bir kişi tarafından çevrilmek yerine, Microsoft makine-çevirisi yazılımı ile çevrilmiştir. Microsoft size hem kişiler tarafından çevrilmiş, hem de makine-çevrisi ile çevrilmiş makaleler sunar. Böylelikle, bilgi bankamızdaki tüm makalelere, kendi dilinizde ulaşmış olursunuz. Bununla birlikte, makine tarafından çevrilmiş makaleler mükemmel değildir. Bir yabancının sizin dilinizde konuşurken yapabileceği hatalar gibi, makale; kelime dağarcığı, söz dizim kuralları veya dil bilgisi açısından yanlışlar içerebilir. Microsoft, içeriğin yanlış çevrimi veya onun müşteri tarafından kullanımından doğan; kusur, hata veya zarardan sorumlu değildir. Microsoft ayrıca makine çevirisi yazılımını sıkça güncellemektedir.
Makalenin İngilizcesi aşağıdaki gibidir:169960
Kullanım Dışı Bilgi Bankası İçeriği Yasal Uyarı
Bu makale, Microsoft'un artık destek sağlamadığı ürünler ile ilgili olarak yazılmıştır. Bu nedenle, bu makale "olduğu gibi" sağlanmıştır ve bundan sonra güncelleştirilmeyecektir.

Geri Bildirim Ver

 

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