如何修改数据库的快照隔离级别

背景说明:

经常接到现场反馈,执行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语句执行非常快。

正常情况下,这语句很快就可以执行完毕。如果 很长时间没有反应 ,还是有连接没有停掉。

你可能感兴趣的:(K/3,Cloud)