1. 程式人生 > >如何修改資料庫的快照隔離級別

如何修改資料庫的快照隔離級別

背景說明:

經常接到現場反饋,執行K/3 Cloud某個功能時,系統卡死

此時連線到SQL Server資料庫,執行如下SQL語句搜尋資料庫的程序,發現有明顯的阻塞

-- 檢查死鎖與阻塞
select * from Sys.SysProcesses where blocked <> 0
-- 說明:如果本語句能夠搜尋到結果,說明是有資料庫阻塞

執行如下語句檢視造成阻塞的SQL語句:

--檢視程序的詳情:造成阻塞的SQL
dbcc inputbuffer(1)

如果發現,造成阻塞的語句,是SELECT取數語句,那麼很可能是資料庫讀快照隔離級別為0,導致讀資料庫也上了排它鎖。

執行如下語句,可以確認是否如此:


select is_read_committed_snapshot_on, * from sys.databases
--如果當前賬套對應的資料庫  is_read_committed_snapshot_on = 0,那麼會在讀資料庫時也上排他鎖,非常容易發生死鎖,造成資料庫卡死。




解決方案:

把資料庫  is_read_committed_snapshot_on 設定為1,可以有效解決這個問題。
本帖介紹,如何修改資料庫這個選項。





如何設定  is_read_committed_snapshot_on  = 1?

可以通過如下語句達成目標:
use master;
alter database AIS20160127100532
 set read_committed_snapshot on;

但是,執行此語句時,必須關掉資料庫的全部連結,否則語句執行時,會一直卡在那裡。

請按照如下步驟,停掉全部資料庫連結後,再執行此語句:

1. 如果應用伺服器、管理伺服器部署在其他機器上,則停掉應用伺服器、K/3 Cloud管理伺服器:關機;

2. 如果應用伺服器、管理伺服器,與資料庫伺服器,部署在一臺機器上,則停掉K/3 Cloud兩個後臺服務:
K3CloudJobProcess, K3CloudManager,改為手動啟動並停止服務;

3. 停止IIS Admin Service服務,並改為手動;


2016-3-7 09:33 上傳
下載附件
(171.1 KB)


4. 重啟資料庫伺服器;

5. 到Windows服務列表,停止SQL Server相關的多個服務。直接停止即可,無需改為手動;




6. 開啟資料庫活動與監視器:




7. 找到目標資料庫(資料中心實體庫),結束程序。



如上截圖,僅用於演示如何結束資料庫,請不要按照此圖所示,結束master資料庫。
應該結束的是資料中心實體庫AISxxxxx。

8. 執行SQL語句:

use master;
alter database AIS20160127100532 set read_committed_snapshot on;

9. 重啟資料庫伺服器,重啟應用伺服器,並回覆被停止的Window服務。


本地按照上述步驟成功切換資料庫隔離界別,SQL語句執行非常快。

正常情況下,這語句很快就可以執行完畢。如果很長時間沒有反應,還是有連線沒有停掉。