INF: 分析,以及避免 SQL Server 中的死結

文章翻譯 文章翻譯
文章編號: 169960 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

結論

Microsoft SQL Server 會使用鎖定來維護交易的完整性和資料庫一致性。SQL Server 6.5 版選擇性地使用資料列層級鎖定的插入作業,並使用頁面層級鎖定用於其他作業。如同任何的關聯式資料庫系統鎖定可能會導致死結之間的使用者。

例如,假設 User1 (或 Connection1) 上有一個鎖定資料項目"A"而想上資料的項目鎖定"B"。User2 資料項目 「 B 」 上有一個鎖定,而現在想資料項目 A.」 上的鎖定在此 SQL Server] 案例 [User1] 或 [User2 會鎖死受害者,其他使用者會被授與要求的鎖定。

在 SQL Server 應用程式開發人員可以決定哪個連線將會為死結的犧牲者候選藉由使用 SET DEADLOCK_PRIORITY。如果開發人員不會不將指定的死結優先權,SQL Server 會藉由選擇程序完成鎖定的循環的鏈結選取死結的犧牲者。

資料庫應用程式行為的系統可能會以不同方式時從一個關聯式資料庫移植至另一個,基礎關聯式資料庫系統的實作。要尋找的行為變更區域的其中一個已鎖定。本文將告訴您如何分析死結在 SQL Server 和技巧可以讓您避免它們。

其他相關資訊

這篇文章強調使用追蹤旗標 T1204 輸出分析死結。設定追蹤旗標 T1204 時 SQL Server 會在它發生時,列印死結的相關資訊。若要將此追蹤旗標在命令提示字元啟動 SQL Server 使用下列命令:
   sqlservr -c -T1204
				

追蹤結果會傳送到主控台] 視窗中,除非您將設定追蹤旗標 T3605,它將追蹤輸出傳送至錯誤記錄檔。

當兩個連線更新相反順序的資料表時,可能就會發生死結。 比方說一條連線插入到資料表"example1"第一個,然後到 「 example2 」 而另一個連線插入到資料表"example2"第一個,然後再進入 「 example1 」 在交易內。範例案例會有幫助說明如何避免死結。

以下是用來建立用於這個範例資料表的 SQL 陳述式:
   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
				

範例 1: 資料表插入相反順序

在這個範例中,相反順序插入兩個資料表,而且發生死結。死結也會發生當兩個或更多的連線會在相反順序的資料表上執行 「 更新或刪除。
   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')
				

這個時候 Connection1 可能封鎖 Connection2,因為資料列插入 Connection2 可能 Connection1 其中已經有插入資料列,而是保留鎖定在同一頁上。
   Connection1 > INSERT INTO example2 VALUES (100, 'AAAA', 'CCC')
				

這個時候 Connection2 可能封鎖 Connection1,因為資料列插入 Connection1 可能 Connection2 其中已經有插入資料列,而保留鎖定在同一頁上。這會造成死結。

以下是追蹤旗標 1204 會發生死結的輸出:
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
				

死結追蹤的每一行可以告知使用者更多關於死結。 Connection1 spid 13,Connection2 spid 14 (您可以判斷 spid 藉由使用 sp_who 系統預存程序與連線關聯)。
   >> 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 鎖定,並已封鎖的 SPID 14,已經有資料表 example2 上頁 0x188 的 EX_PAGE 鎖定 dbid 6 中。在的鎖定屬於叢集索引頁上。
      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
				

目前由 SPID 13 所執行的命令是一個 INSERT,並追蹤提供輸入緩衝區的一部份。
   >> 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 鎖定,並已經掌握在同一頁的 [EX_PAGE 鎖定的 SPID 13,封鎖。
   >> VICTIM: spid 13, pstat 0x0000 , cputime 30
   SQL Server has chosen spid 13 as the deadlock victim.
				

以下是各種鎖定表示在追蹤中的說明:

SH_INT 和 EX_INT
意圖鎖定在較高層級的項目 (,例如資料表) 上採取較低層級鎖定 (,例如頁面) 之前可以採取,因為鎖定管理員是不知道的項目 (在這個案例、 頁面和資料表中) 的不同型別之間的關係。如果資料表上不採取 EX_INT 鎖定在頁面上進行 EX_PAG 鎖定前,在同一個資料表,另一位使用者花 EX_TAB 鎖定,並鎖定管理員不會知道有衝突存在。目前,SQL Server 資料表上只能有意圖鎖定。 有兩種意圖鎖定: 共用 (SH_INT) 和獨占 (EX_INT) 鎖定。

EX_PAGE
這是頁面會更新,因為以一個的 DELETE UPDATE,或使用 INSERT 陳述式插入資料列層級鎖定 (IRL) 停用時採取的獨占頁鎖定。

UP_PAGE
這是當掃描頁面,並最佳化器知道頁面將會更新時,共用頁鎖定的位置採取的更新頁鎖定 (或使用 UPDLOCK 提示)。

PR_EXT、 NX_EXT、 UPD_EXT 及 EX_EXT
配置或解除配置磁碟空間時,就會採用這些鎖定。UPD_EXT 做配置或解除頁面配置從現有的範圍時,且時配置或解除配置整個範圍,其他人使用。

IX_PAGE 和 LN_PAGE
這些是 IRL 鎖定。IX_PAGE 是在網頁上的意圖-至-不要-列-鎖定鎖定。 當網頁在其 IRL 執行被分割的需求會採取 LN_PAGE。

RLOCK 和 XRLOCK
周遊的索引 b 型樹狀目錄時,就會採用這些短期的鎖定。這種鎖定的有兩種類型: 共用 (RLOCK) 和獨占 (XRLOCK)。 雖然索引頁上更新時採用獨占鎖定在掃描時,採用共用的鎖定。

EX_TAB
這是發生於 SQL Server 最佳化器判斷資料表掃描是最有效率的方式來解決更新查詢 (例如,在資料表上沒有索引) 的獨占資料表鎖定。當您鎖定表格有 TABLOCKX 提示或 SQL Server escalates 分頁鎖定資料表鎖定的資料表上時,也會出現 EX_TAB 鎖定。

SH_TAB
這是一個共用時,最佳化器會假設該大部分的資料表使用的資料表鎖定將會掃描 (或頁面鎖定 escalates) 或使用 TABLOCK 提示。

如果兩個連線更新以下順序中的資料表,可以避免先前的死結範例:
   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')
				

範例 2: 插入相同的資料表的不同部分

當兩個連線插入不同部分的相反順序相同的資料表資料列共用網頁時,也可能會發生這個死結。例如:
   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')
				

此範例] 表格中沒有叢集的索引 example1 資料表的第一個資料行上。第一個資料行相同的值的資料列將會傾向於落在同一頁上。在範例 Connection1 插入第二個資料列可能要先落 Connection2,插入第一列與在同一頁上,因為它們都有叢集的索引值為 400。這會造成 Connection2 區塊 Connection1。
   Connection2 > INSERT INTO example1 VALUES (100, 'AAAB', 'CCC')
				

現在死結而導致的 Connection1 可能也會封鎖 Connection2。 以下是死結追蹤:
   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
				

頁面 0x2c5 的 EX_PAGE 鎖定該 spid 16 要求之後沒有第一個插入已經保留頁面 0x2c5 的 EX_PAGE 鎖定的 SPID 15,被封鎖。並 spid 15 也有被封鎖 spid 16 上頁 0x8db 前置有 EX_PAGE 鎖定等候到死結。

這個死結可避免為資料表 example1 的啟用 IRL 使用下列命令:
   sp_tableoption 'example1', 'insert row lock', true
				

範例 3: 插入使用 IRL

IRL 允許兩個或多個使用者共用網頁,當它們僅執行插入動作,常導致更好的輸送量。不過,啟用 IRL 將不一定減少死結。在某些情況下 IRL 可能會引入死結。
   Connection1 > BEGIN TRANSACTION
   Connection2 > BEGIN TRANSACTION
   Connection1 > INSERT INTO example1 VALUES (100, 'AAAA', 'CCC')
   Connection2 > INSERT INTO example1 VALUES (105, 'AAAB', 'CCC')
				

啟用 IRL,與這兩個連線會包含兩個新的資料列的頁面上保留 IX_PAGE 鎖定。如果已停用 IRL,Connection1 會取得一個 EX_PAGE] 鎖定並 Connection2 會遭到封鎖立即。
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

這個時候 Connection2 需要做 Connection1 的 IX_PAGE 鎖定與不相容的 UPDATE 陳述式的獨占頁鎖定。 因此,Connection2 會等待。
   Connection1 > UPDATE example1 SET column3 = 'CCCA' where column1 = 100
   and column2 = 'AAAA'
				

現在 Connection1 可能會導致死結的 Connection2 由被封鎖。以下是死結追蹤:
   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 (其中一個連線) 正在等候是第一個步驟,可取得獨占頁鎖定的 UP_PAGE] 鎖定。它已被封鎖在頁面 0x2c5 掌握 IX_PAGE 鎖定的 SPID 18。Spid 18 在同一頁上等待 UP_PAGE 鎖定和 IX_PAGE spid 17 所持有的鎖定封鎖。 這會導致死結因為 IX_PAGE 鎖定是可共用,而不是 UP_LOCK。在第一個插入,期間同時 spids 得到 IX_PAGE 鎖定在同一頁上,並稍後再嘗試升級鎖定不可行,因為 UP_PAGE 鎖定是獨佔的 UP_PAGE 鎖定。

避免死結的方法之一是直接將更新的值插入而不是插入和更新同一個交易中的資料列的資料表。如果不這麼做,使用下列命令以停用 IRL 將有助於避免死結:
   sp_tableoption 'example1', 'insert row lock', false
				

範例 4: 插入至位於同一頁上的資料列

兩個 spids 正在處理的資料列不同,但屬於同一個頁面時,也可能會造成死結。
   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'
				

這個時候 Connection1 可能被 Connection2 所封鎖。因為 Connection1 想要更新的頁面,其中 Connection2 有已經插入一列中的資料列,就會發生這種情況。
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 105
   and column2 = 'AAAB'
				

這個時候會導致死結的 Connection1 可能也會封鎖 Connection2。Connection2 想更新的網頁 Connection1 已插入一列中的資料列時,就會發生這種情況。以下是死結追蹤:
   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
				

這個死結可避免透過深壓淺出資料列在不同的頁面。執行這項操作一的方法是重新建立大型的填滿因數與此資料表上的叢集的索引。下列是建立叢集的索引具有 50%的填滿因數的陳述式:
   create unique clustered index ex1ind1 on example1 (column1, column2)
   with fill factor = 50, PAD_INDEX
				

此陳述式會建立叢集的索引離開頁面的下半部空包括非分葉層級的叢集索引 (因為非 PAD_INDEX 選項)。資料表時,控制項佔有雙實際大小和每一頁的資料列數目它們是一樣的一半。

填滿因數不維護資料表上 ; 資料表重組與指定的填滿因數只在索引建立時間。經過一段時間,每一頁資料列將變更從指定索引建立期間的填滿因數。如果發生這種情況可能會重新建立叢集的索引,並想要填滿因數是個不錯的作法。

若要避免先前的死結情況的另一個解決方法是填補的資料表,空資料行 (比方說 dummy1 char(255))。這會增加資料列的大小,通往較少的資料列,每一頁 (最少為每一頁的一個資料列)。因為這種類型的與邊框距離經過一段時間維護,並不需要重新建立叢集的索引,以維持與邊框距離 (雖然您可能想要重新建立叢集的索引,因為其他原因)。這項技術的缺點就是儲存空間空的欄位上浪費掉。

範例 5: 填補資料列

填補資料列會導致較少的資料列,每一頁 (因此較少的死結),但它不會完全消除死結。

此範例] 表格中 example1 填補至佔據每一頁的一個資料列。以下是用來建立資料表為使本範例將陳述式:
   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'
				

這個時候 Connection1 被封鎖 Connection2 更新資料列時。因為 SQL Server 必須維護頁面鏈結指標,鎖定前一頁]、 [下一個頁面] 與 [頁,正在更新。因為 Connection2 持有鎖定前一頁上,Connection1 必須等到 Connection2 認可交易。
   Connection2 > UPDATE example1 SET column3 = 'CCCB' where column1 = 101
   and column2 = 'AAAB'
				

這個時候將 Connection2 封鎖由 Connection1,因為它必須鎖定前一頁目前正由 Connection1 鎖定。結果是死結。以下是死結追蹤:
   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
				

插入虛設資料列會被插入,更新,或刪除資料列之間可以避免這個死結。比方說如果 Connection1 運作 (插入、 更新或刪除) 與資料列 pk = 1 和 Connection2 適用於資料列 pk = 插入這些兩個列之間的資料列的 5 (例如資料列包含 pk = [3]) 會避免死結。這個方法也會增加在資料表的大小,但可能會對應用程式重要的那些佇列資料表最佳的解決方案。

範例 6: 非叢集索引

在某些情況下非叢集的次要索引可能會引入死結。在這個範例的次要索引維護引入了死結。

以下是用來建立此範例中使用的次要索引陳述式:
   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
				

這個時候 Connection2 可能會被封鎖由 Connection1 因為 Connection1 可能會保留鎖定次要的非叢集索引頁面上 Connection2 需要更新。
   Connection1 > UPDATE example1 SET column3 = 'CCCZ' where column1 = 305
				

這個時候 Connection1 可能會導致死結的 Connection2 由被封鎖。這種情況可能發生在當 Connection1 正在等候更新非叢集次要索引位置 Connection2 有已經插入,而且持有鎖定,在該頁面上的鎖定。以下是死結追蹤這個死結範例:
   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
				

卸除次要索引可以避免這個死結。您不可能填補索引包含一個資料列,每一頁,因此可避免這種情況下,只能藉由消除非叢集的次要索引或修改應用程式。

死結可能會發生兩個以上的連線死結追蹤在這種情況下列出 spids 參與死結,同時也有衝突的鎖定的。RLOCK 與 XRLOCK 鎖定,取得索引周遊期間可能會發生死結。因為範圍鎖定 (PR_EXT、 NX_EXT、 UPD_EXT & EX_EXT),可能也會鎖死。

取得更多資訊有關分析死結中,您可以啟用下列的追蹤旗標:

t1200
列印所有的鎖定要求/釋放資訊它發生時是否死結涉及與否。這是在效能,方面昂貴,但它可以用於分析。

t1206
列印所有參與 spids 死結中所持有的鎖定。

t1208
列印主機名稱以及用戶端提供的程式名稱。這可幫助識別假設用戶端指定唯一的值,每個連線用戶端參與一個死結。

屬性

文章編號: 169960 - 上次校閱: 2003年10月16日 - 版次: 3.0
這篇文章中的資訊適用於:
  • Microsoft SQL Server 6.5 Standard Edition
關鍵字:?
kbmt kbhowto kbusage KB169960 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:169960
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。
依現狀不再更新的知識庫內容免責聲明
本文旨在說明 Microsoft 不再提供支援的產品。因此,本文係依「現狀」提供,不會再更新。

提供意見

 

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