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

背景说明:

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

正常情况下,这语句很快就可以执行完毕。如果 很长时间没有反应 ,还是有连接没有停掉。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
数据库隔离级别的底层实现可以通过多种方式来完成,这取决于具体的数据库管理系统和底层硬件平台。以下是一些常见的实现方式: 1. 锁定机制:数据库管理系统可以使用锁定机制来实现隔离级别。当一个事务请求访问某个数据时,数据库会锁定该数据,直到该事务完成。其他事务将被阻塞,直到锁定被释放。 2. 多版本并发控制(MVCC):MVCC 是一种在高并发环境下实现隔离级别的技术。它通过为每个事务创建一个快照版本来实现隔离。每个事务看到的数据版本是其启动时的版本,而不受其他事务的影响。这样可以保证并发性和隔离性。 3. 时间戳排序:另一种实现隔离级别的方法是使用时间戳排序。每个事务都被赋予一个时间戳,然后数据库管理系统根据时间戳来决定哪个事务应该被执行。这可以确保事务之间的隔离,并防止数据损坏。 4. 快照隔离:快照隔离是一种实现隔离级别的方法,它为每个事务提供一个独立的快照。每个事务看到的数据都是其启动时的快照,而不受其他事务的影响。这可以避免脏读、不可重复读和幻读等问题。 总的来说,实现隔离级别的底层技术非常复杂,需要考虑到并发性、性能、资源消耗等多个方面。不同的数据库管理系统和底层硬件平台会选择不同的实现方式,以满足不同的需求和应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值