INF: Phân tích và tránh Deadlocks trong SQL Server

D?ch tiêu đ? D?ch tiêu đ?
ID c?a bài: 169960 - Xem s?n ph?m mà bài này áp d?ng vào.
Bung t?t c? | Thu g?n t?t c?

? Trang này

TÓM T?T

Microsoft SQL Server duy tr? giao d?ch toàn v?n và cơ s? d? li?u s? đ?ng b? b?ng cách s? d?ng ? khóa. SQL Server Phiên b?n 6,5 tu? ch?n s? d?ng hàng- c?p khóa cho chèn các ho?t đ?ng và s? d?ng trang c?p khóa cho khác ho?t đ?ng kinh doanh. Như v?i b?t k? h? th?ng cơ s? d? li?u quan h?, khóa có th? d?n đ?n deadlocks gi?a ngư?i s? d?ng.

Ví d?, gi? s? User1 (hay Connection1) có m?t ? khóa trên d? li?u m?c "A" và mu?n m?t ? khóa trên d? li?u m?c "B." User2 có m?t khóa trên d? li?u m?c "B" và bây gi? mu?n m?t ? khóa trên d? li?u m?c "A." Trong trư?ng h?p này SQL Server, ho?c User1 ho?c User2 s? là m?t n?n nhân b? t?c, và ngư?i dùng khác s? đư?c c?p các yêu c?u khóa.

Trong SQL Server, các nhà phát tri?n ?ng d?ng có th? quy?t đ?nh k?t n?i s? là ?ng c? viên cho b? t?c n?n nhân b?ng cách s? d?ng SET DEADLOCK_PRIORITY. Nếu nhà phát tri?n không ch? đ?nh m?t ưu tiên cho deadlocks, SQL Server ch?n các n?n nhân b? t?c b?ng cách ch?n quá tr?nh đ? hoàn t?t các thông tư chu?i ? khóa.

H? th?ng ?ng d?ng cơ s? d? li?u có th? hành x? m?t cách khác nhau khi đư?c chuy?n t? m?t trong nh?ng quan h? cơ s? d? li?u khác, d?a trên vi?c th?c hi?n các h? th?ng cơ s? d? li?u quan h?. M?t trong nh?ng khu v?c đ? t?m các thay đ?i hành vi là khóa. Bài vi?t này gi?i thích làm th? nào đ? phân tích các deadlocks trong SQL Máy ch? và các k? thu?t b?n có th? s? d?ng đ? tránh chúng.

THÔNG TIN THÊM

Bài vi?t này nh?n m?nh b?ng cách s? d?ng đ?u ra c?a water c? T1204 đ? phân tích deadlocks. Khi d?u v?t c? T1204 đư?c thi?t l?p, SQL Server in thông tin v? b? t?c khi nó x?y ra. Đ? s? d?ng này c? water, s? d?ng các l?nh sau t?i d?u nh?c l?nh đ? b?t đ?u máy ch? SQL:
   sqlservr -c -T1204
				

K?t qu? water đư?c g?i đ?n c?a s? giao di?n đi?u khi?n, tr? khi b?n đ?t c? hi?u d?u v?t T3605, mà s? g?i ra d?u v?t cho l?i đăng nh?p.

Deadlocks có th? x?y ra khi hai k?t n?i C?p Nh?t b?ng theo th? t? ngư?c l?i. Ví d?, m?t trong nh?ng k?t n?i chèn vào b?ng "example1" đ?u tiên và sau đó vào "example2," trong khi m?t k?t n?i chèn vào b?ng "example2" đ?u tiên và sau đó vào "example1" trong m?t giao d?ch. M?t k?ch b?n ví d? là h?u ích đ? minh h?a cách tránh deadlocks.

Sau đây là nh?ng đi?u kho?n SQL đư?c s? d?ng đ? t?o ra b?ng đư?c s? d?ng cho vi?c này Ví d?:
   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
				

Ví d? 1: B?ng Insertions theo th? t? ngư?c l?i

Trong ví d? này, hai b?ng đ? đư?c đưa vào trong tr?t t? đ?i di?n và m?t b? t?c x?y ra. Deadlocks c?ng có th? x?y ra khi th?c hi?n k?t n?i hai ho?c nhi?u hơn C?p nh?p ho?c xoá trên b?ng theo th? t? ngư?c l?i.
   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')
				

T?i th?i đi?m này, Connection1 có th? ngăn ch?n Connection2, b?i v? hàng Connection2 chèn tháng trên cùng m?t trang nơi Connection1 có đ? chèn m?t hàng và là đang n?m gi? m?t khóa.
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

T?i th?i đi?m này, Connection2 có th? ch?n Connection1, b?i v? hàng Connection1 chèn tháng trên cùng m?t trang nơi Connection2 có đ? chèn m?t hàng và là đang n?m gi? m?t khóa. Đi?u này gây ra m?t b? t?c.

Sau đây là đ?u ra cho water c? 1204 khi b? t?c x?y ra:
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
				

M?i d?ng v?t b? t?c có th? cho bi?t ngư?i dùng bi?t thêm v? m?t b? t?c. Connection1 là d?ch v? spid 13 và Connection2 là d?ch v? spid 14 (b?n có th? xác đ?nh các các d?ch v? SPID g?n li?n v?i m?t k?t n?i b?ng cách s? d?ng h? th?ng sp_who lưu tr? th? t?c).
   >> 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')
				

13 D?ch v? SPID yêu c?u EX_PAGE khóa và đ? b? ch?n b?i d?ch v? spid 14, mà đ? có EX_PAGE khóa cho trang 0x188 trên b?ng example2 trong dbid 6. Các khóa đư?c t? ch?c trên trang thu?c nhóm ch? s?.
      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
				

L?nh hi?n hành th?c hi?n b?i d?ch v? spid 13 là m?t CHÈN và v?t cho m?t ph?n c?a b? đ?m đ?u vào.
   >> 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')
				

D?ch v? SPID 14 ch? đ?i EX_PAGE khóa và đang b? ch?n b?i d?ch v? spid 13, mà đ? có EX_PAGE khóa trên cùng m?t trang.
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

Sau đây là m?t gi?i thích v? nh?ng g? các ? khóa khác nhau có ngh?a là trong các water:

SH_INT và EX_INT
? đ?nh ? khóa đư?c đưa vào m?t kho?n m?c hơn (ví d?, m?t b?ng) trư?c khi ? khóa c?p th?p hơn (ví d?, m?t trang) có th? đư?c th?c hi?n, b?i v? các Lock qu?n l? là không ? th?c c?a m?i quan h? gi?a các lo?i khác nhau c?a kho?n m?c (trong trư?ng h?p này, các trang và b?ng). N?u m?t EX_INT khóa không đư?c đưa vào b?ng trư?c khi EX_PAG ? khóa trên các trang này, ngư?i dùng khác có th? m?t m?t EX_TAB khóa vào cùng m?t b?ng và lock qu?n l? s? không bi?t r?ng m?t xung đ?t t?n t?i. Hi?n t?i, SQL Server có ? đ?nh ? khóa ch? trên b?ng. Có hai lo?i ? khóa ? đ?nh: chia s? (SH_INT) và đ?c quy?n (EX_INT) ? khóa.

EX_PAGE
Đây là m?t khóa đ?c quy?n trang đư?c th?c hi?n khi m?t trang đư?c C?p Nh?t do m?t tuyên b? DELETE, UPDATE, ho?c CHÈN v?i chèn hàng c?p khóa (IRL) vô hi?u hoá.

UP_PAGE
Đây là m?t c?p nh?t trang khóa mà đư?c l?y t?i ch? c?a m?t khóa Trang chia s? khi m?t trang đư?c quét và tr?nh t?i ưu hóa bi?t r?ng trang s? C?p Nh?t (ho?c g?i ? UPDLOCK đư?c s? d?ng).

PR_EXT, NX_EXT, UPD_EXT và EX_EXT
Các ? khóa đư?c tính khi phân b? ho?c deallocating đ?a. UPD_EXT đư?c l?y khi phân b? ho?c deallocating m?t trang t? m?t m?c đ? hi?n t?i và nh?ng ngư?i khác đư?c s? d?ng khi phân b? ho?c deallocating toàn b? extents.

IX_PAGE và LN_PAGE
Đây là nh?ng IRL ? khóa. IX_PAGE là m?t m?c đích-đ?-làm-hàng-khóa khóa trên m?t trang. LN_PAGE đư?c th?c hi?n khi m?t trang mà IRL đang đư?c th?c hi?n nhu c?u đư?c chia.

RLOCK và XRLOCK
Các ? khóa ng?n h?n đư?c l?y khi vư?t qua m?t ch? s? b-cây. Không có hai lo?i này lo?i khóa: chia s? (RLOCK) và đ?c quy?n (XRLOCK). ? khóa đư?c chia s? đư?c th?c hi?n trong khi quét, trong khi ? khóa đ?c quy?n đư?c đưa vào các trang ch? m?c trong th?i gian m?t C?p Nh?t.

EX_TAB
Đây là m?t đ?c quy?n b?ng khóa đó x?y ra khi t?i ưu hóa SQL Server xác đ?nh r?ng m?t b?ng quét là cách hi?u qu? nh?t đ? gi?i quy?t m?t b?n C?p Nh?t truy v?n (ví d?, khi không có không có l?p ch? m?c trên m?t b?ng). EX_TAB ? khóa c?ng xu?t hi?n khi b?n khóa b?ng TABLOCKX g?i ? ho?c khi SQL Server leo thang các ? khóa trang trên m?t b?ng cho m?t b?ng khóa.

SH_TAB
Đây là m?t khóa dùng chung bàn đư?c s? d?ng khi t?i ưu hóa gi? đ?nh r?ng h?u h?t các b?ng s? đư?c quét (ho?c trang khóa leo thang) ho?c các G?i ? TABLOCK đư?c s? d?ng.

Ví d? b? t?c có th? tránh đư?c n?u các k?t n?i hai C?p Nh?t b?ng theo th? t? sau:
   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')
				

Ví d? 2: Insertions sang các ph?n khác nhau c?a cùng m?t b?ng

B? t?c này c?ng có th? x?y ra khi hai k?t n?i đưa vào khác nhau ph?n c?a cùng m?t b?ng theo th? t? ngư?c l?i khi hàng chia s? các trang. Cho Ví d?:
   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')
				

Trong b?ng ví d? này, đó là m?t ch? s? c?m trên c?t đ?u tiên c?a b?ng example1. Hàng v?i các giá tr? tương t? cho các c?t đ?u tiên s? có xu hư?ng gi?m trên cùng m?t trang. Trong ví d? này, d?ng th? hai đư?c đưa vào b?i Connection1 có l? s? rơi vào cùng m?t trang như hàng đ?u đư?c chèn vào b?i Connection2, b?i v? c? hai đ?u có m?t giá tr? nhóm ch? s? 400. Đi?u này nguyên nhân gây Connection2 cho kh?i Connection1.
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

Bây gi? Connection2 c?ng có th? b? ch?n b?i Connection1, d?n t?i m?t b? t?c. Sau đây là d?u v?t b? t?c:
   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
				

Yêu c?u 16 spid cho EX_PAGE khóa cho trang 0x2c5 b? ch?n b?i d?ch v? spid 15, mà đ? gi? EX_PAGE khóa cho trang 0x2c5 sau khi nó đ? làm ngư?i đ?u tiên chèn. Và spid 15 c?ng đ? b? ch?n b?i d?ch v? spid 16 ngày ch? đ?i cho m?t EX_PAGE khóa cho trang 0x8db d?n đ?n deadlock.

B? t?c này có th? tránh đư?c b?ng cách s? d?ng l?nh sau đ? kích ho?t tính năng IRL Đ?i v?i b?ng example1:
   sp_tableoption 'example1', 'insert row lock', true
				

Ví d? 3: Insertions s? d?ng IRL

IRL cho phép hai ho?c nhi?u ngư?i dùng đ? chia s? m?t trang khi h? ch? chèn các ho?t đ?ng, mà thư?ng k?t qu? trong thông lư?ng t?t hơn. Tuy nhiên, cho phép IRL s? không ph?i luôn luôn gi?m deadlocks. Trong m?t s? trư?ng h?p, IRL có th? gi?i thi?u deadlocks.
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

V?i IRL b?t, c? hai k?t n?i s? t? ch?c m?t khóa IX_PAGE trên trang có hai hàng m?i. N?u IRL b? t?t, Connection1 đ? có th? mua m?t khóa EX_PAGE, và Connection2 s? có b? ch?n ngay l?p t?c.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

T?i th?i đi?m này, Connection2 c?n m?t đ?c quy?n trang khóa đ? làm m?t b?n C?p Nh?t tuyên b?, đó là không tương thích v?i Connection1 c?a IX_PAGE khóa. Do đó, Connection2 s? ch? đ?i.
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

Bây gi? Connection1 có th? b? ch?n b?i Connection2, d?n t?i m?t b? t?c. Các sau đây là d?u v?t b? t?c:
   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
				

D?ch v? SPID 17 (k?t n?i m?t) ch? đ?i m?t khóa UP_PAGE, là ngư?i đ?u tiên bư?c đ? nh?n đư?c m?t khóa đ?c quy?n trang. Nó đang b? ch?n b?i d?ch v? spid 18, mà gi? IX_PAGE khóa trên trang 0x2c5. D?ch v? SPID 18 ch? đ?i UP_PAGE khóa trên cùng m?t trang, và b? ch?n b?i IX_PAGE khóa đư?c t? ch?c b?i d?ch v? spid 17. Đi?u này d?n đ?n m?t b? t?c b?i v? IX_PAGE khóa là sharable, trong khi UP_LOCK không ph?i là. Trong ph? trang đ?u tiên, c? hai SPID nh?n IX_PAGE khóa các cùng m?t trang, và sau đó h? đ? c? g?ng đ? nâng c?p các khóa đ? UP_PAGE lock, mà là không th? b?i v? UP_PAGE khóa là đ?c quy?n.

M?t cách đ? tránh b? t?c là đ? chèn giá tr? C?p Nh?t tr?c ti?p vào b?ng thay v? chèn và sau đó C?p nh?t hàng trong cùng m?t giao d?ch. N?u đi?u này là không th?, b?ng cách s? d?ng l?nh sau đ? vô hi?u hoá IRL s? giúp đ? tránh b? t?c:
   sp_tableoption 'example1', 'insert row lock', false
				

Ví d? 4: Insertions đ? hàng trên cùng m?t trang

M?t b? t?c c?ng có th? d?n đ?n khi các hàng SPID hai đang làm vi?c trên đang khác nhau nhưng thu?c v? cùng m?t trang.
   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'
				

T?i th?i đi?m này, Connection1 có th? b? ch?n b?i Connection2. T?nh h?nh này có th? x?y ra b?i v? Connection1 mu?n c?p nh?t liên ti?p trong m?t trang nơi Connection2 đ? chèn m?t hàng.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

T?i th?i đi?m này, Connection2 có th? c?ng b? ch?n b?i Connection1, mà s? d?n đ?n b? t?c m?t. T?nh h?nh này có th? x?y ra khi Connection2 mu?n C?p nh?t liên ti?p trong m?t trang nơi Connection1 đ? chèn m?t hàng. Sau đây là v?t b? t?c:
   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
				

B? t?c này có th? tránh đư?c b?ng cách tr?i ra các hàng hơn khác nhau các trang. M?t phương pháp đ? làm đi?u này là đ? tái t?o ch? s? nhóm trên b?ng này v?i m?t y?u t? l?n đi?n. Sau đây là m?t tuyên b? r?ng t?o ra m?t ch? s? c?m v?i m?t đi?n vào h? s? 50 ph?n trăm:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

Tuyên b? này t?o ra ch? s? nhóm đ? l?i m?t n?a các trang có s?n ph?m nào, bao g?m các c?p đ? không lá c?a các ch? s? nhóm (v? các Tùy ch?n PAD_INDEX). B?ng chi?m g?p đôi kích thư?c th?c t?, và các s? lư?ng hàng trên m?i trang có m?t n?a c?a nh?ng g? h? đ?.

Y?u t? đi?n không đư?c duy tr? trên b?ng a; b?ng là re-organized v?i các y?u t? đư?c ch? đ?nh đi?n ch? trong th?i gian t?o ch? m?c. Theo th?i gian, các hàng trên m?i trang s? thay đ?i t? các y?u t? đi?n đư?c ch? r? trong ch? m?c sáng t?o. Khi đi?u này x?y ra, nó có th? là m?t ? tư?ng t?t đ? tái t?o các nhóm ch? m?c v?i các y?u t? b?n mu?n đi?n vào.

M?t gi?i pháp đ? tránh t?nh h?nh b? t?c trư?c là đ? pad các b?ng v?i gi? c?t (ví d?, dummy1 char(255)). Đi?u này làm tăng Kích thư?c c?a các hàng và d?n đ?n ít hơn hàng trên m?i trang (càng ít như m?t hàng cho m?i Trang). B?i v? lo?i đ?m đư?c duy tr? theo th?i gian, b?n không làm như th? c?n đ? tái t?o ch? s? nhóm đ? duy tr? đ?m (m?c dù b?n có th? mu?n tái t?o ch? s? nhóm v? l? do khác). Các b?t l?i c?a k? thu?t này là dung lư?ng là l?ng phí trên dummy các l?nh v?c.

Ví d? 5: Padding hàng

Padding hàng d?n đ?n ít hơn hàng trên m?i trang (do đó ít deadlocks), nhưng nó lo?i s? không hoàn toàn b? deadlocks.

Trong b?ng ví d? này, example1 đ?n chi?m m?t hàng trên m?i trang. Các sau đây là nh?ng đi?u kho?n đư?c s? d?ng đ? t?o ra b?ng ví d? này:
   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'
				

T?i th?i đi?m này, Connection1 b? ch?n Connection2 trong khi đang c?p nh?t các hàng. B?i v? SQL Server ph?i duy tr? trang-chu?i con tr?, nó khóa các Trang trư?c trang ti?p theo và trang đang đư?c C?p Nh?t. B?i v? Connection2 ch?a m?t ? khóa trên trang trư?c đó, Connection1 ph?i đ?i cho đ?n khi Connection2 cam k?t giao d?ch.
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

T?i th?i đi?m này, Connection2 b? ch?n b?i Connection1 v? nó ph?i khóa trư?c trang, mà hi?n đang b? khóa b?i Connection1. K?t qu? là m?t b? t?c. Sau đây là d?u v?t b? t?c:
   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
				

B? t?c này có th? tránh đư?c b?ng cách chèn gi? hàng gi?a các hàng mà đang đư?c chèn, C?p Nh?t, ho?c b? xóa. Ví d?, n?u Connection1 ho?t đ?ng (chèn, C?p Nh?t ho?c xóa) v?i hàng pk = 1 và Connection2 làm vi?c v?i hàng pk = 5, chèn m?t hàng gi?a nh?ng hai hàng (ch?ng h?n như m?t hàng có ch?a pk = 3) s? tránh deadlocks. Phương pháp này c?ng làm tăng các Kích thư?c c?a b?ng, nhưng có th? là gi?i pháp t?t nh?t cho nh?ng ngư?i hàng đ?i bàn quan tr?ng đ?i v?i các ?ng d?ng.

Ví d? 6: Nonclustered ch? s?

Trong m?t s? trư?ng h?p, không nhóm ch? s? th? c?p có th? gi?i thi?u deadlocks. Trong Ví d? này, vi?c duy tr? các ch? s? trung h?c gi?i thi?u b? t?c.

Sau đây là tuyên b? đư?c s? d?ng đ? t?o ra ch? s? th? c?p đư?c s? d?ng trong Ví d? này:
   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
				

T?i th?i đi?m này, Connection2 có th? b? ch?n b?i Connection1 v? Connection1 có th? gi? m?t ? khóa trên trang ch? m?c không nhóm th? c?p nơi Connection2 c?n C?p Nh?t.
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

T?i th?i đi?m này, Connection1 có th? b? ch?n b?i Connection2, d?n đ?n m?t b? t?c. T?nh h?nh này có th? x?y ra khi Connection1 ch? đ?i m?t khóa đ? c?p nh?t các phi t?p trung ch? trung h?c s? nơi Connection2 đ? Chèn và gi? m?t ? khóa trên trang đó. Sau đây là d?u v?t b? t?c Ví d? b? t?c này:
   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
				

B? t?c này có th? tránh đư?c b?ng cách th? ch? s? trung h?c. Nó không ph?i là t?t đ? pad ch? m?c có ch?a m?t trong hàng trên m?i trang, v? v?y t?nh h?nh này có th? tránh đư?c ch? b?ng cách lo?i b? không nhóm ch? s? trung h?c ho?c b?ng S?a đ?i các ?ng d?ng.

Deadlocks có th? x?y ra v?i các k?t n?i nhi?u hơn hai, trong trư?ng h?p các b? t?c water li?t kê SPID tham gia vào b? t?c và c?ng các xung đ?t ? khóa. Deadlocks có th? x?y ra v?i ? khóa RLOCK và XRLOCK, mà đư?c mua trong th?i gian ch? s? vư?t qua. Deadlocks c?ng có th? x?y ra v? m?c đ? ? khóa (PR_EXT, NX_EXT, UPD_EXT & EX_EXT).

Đ? bi?t thêm chi ti?t v? vi?c phân tích deadlocks, b?n có th? cho phép các sau d?u v?t c?:

T1200
In t?t c? các thông tin yêu c?u/phát hành khóa khi nó x?y ra, cho dù m?t b? t?c là có liên quan hay không. Đi?u này là t?n kém v? hi?u su?t, nhưng nó có th? h?u ích cho vi?c phân tích.

T1206
In t?t c? các ? khóa đư?c t? ch?c b?i tham gia SPID trong b? t?c.

T1208
In các máy ch? tên và tên chương tr?nh đư?c cung c?p b?i khách hàng. Đi?u này có th? giúp xác đ?nh m?t khách hàng tham gia vào m?t b? t?c, gi? s? khách hàng xác đ?nh m?t giá tr? duy nh?t cho m?i k?t n?i.

Thu?c tính

ID c?a bài: 169960 - L?n xem xét sau cùng: 19 Tháng Tám 2011 - Xem xét l?i: 2.0
Áp d?ng
  • Microsoft SQL Server 6.5 Standard Edition
T? khóa: 
kbhowto kbusage kbmt KB169960 KbMtvi
Máy d?ch
QUAN TRỌNG: Bài vi?t này đư?c d?ch b?ng ph?n m?m d?ch máy c?a Microsoft ch? không ph?i do con ngư?i d?ch. Microsoft cung c?p các bài vi?t do con ngư?i d?ch và c? các bài vi?t do máy d?ch đ? b?n có th? truy c?p vào t?t c? các bài vi?t trong Cơ s? Ki?n th?c c?a chúng tôi b?ng ngôn ng? c?a b?n. Tuy nhiên, bài vi?t do máy d?ch không ph?i lúc nào c?ng hoàn h?o. Lo?i bài vi?t này có th? ch?a các sai sót v? t? v?ng, cú pháp ho?c ng? pháp, gi?ng như m?t ngư?i nư?c ngoài có th? m?c sai sót khi nói ngôn ng? c?a b?n. Microsoft không ch?u trách nhi?m v? b?t k? s? thi?u chính xác, sai sót ho?c thi?t h?i nào do vi?c d?ch sai n?i dung ho?c do ho?t đ?ng s? d?ng c?a khách hàng gây ra. Microsoft c?ng thư?ng xuyên c?p nh?t ph?n m?m d?ch máy này.
Nh?p chu?t vào đây đ? xem b?n ti?ng Anh c?a bài vi?t này:169960
Khước từ Nội dung trong Cơ sở Kiến thức Không còn được hỗ trợ
Bài vi?t này nói v? các s?n ph?m mà Microsoft không c?n h? tr? n?a. Do đó, bài vi?t này đư?c cung c?p "nguyên b?n" và s? không đư?c c?p nh?t.

Cung cấp Phản hồi

 

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