迷之自信的Single_User Mode
Alter database Set Single_User
对于任何DBA来说,恐怕都不陌生。在我们需要获取数据库独占访问权来做一些数据库紧急维护的时候,这可能是大多数DBA的首选,但它真的可以实现“独占访问权”吗?
这次我们聊聊Single_User是如何刷新我们认知的
=============================================华丽丽的分割线=============================================
实验目的:测试Single_User模式下是否可以拿到独占权并为所欲为。
照例交代一下我们的环境:Windows 10 + SQL Server 2019,实际上本次实验的结果基本上是覆盖SQL Server全部版本的
并发测试工具:SQLQueryStress(0.9.7.79)
我们先看一下在单用户模式下,持有锁的情况


从上图可以看到,在成功置为Single_User模式后,我们拥有了一个执行Session(id=60)上,DB级别的S锁
这时,我们开启SQLQueryStress,设置查询语句,并发线程数为2,迭代5000次

再次查询持有锁的情况

Session 71、72是我们压力测试工具设置2个线程产生的,可以看到,除了持有S锁外,他们各自还正在申请X锁,只是相互等待而形成了死锁

由上图可以看到,XEvents中存在大量死锁信息,且下图可以看到死锁的细节信息,由Session 71、72导致

此时,当我们再次准备从Session 60中执行语句,将数据库置为Multi_User时,错误发生了:
Session 60也被死锁牺牲了。由此看来,我们并没有真正的获取数据库的“独占访问权”

=============================================华丽丽的分割线=============================================
分析 & 结论:
1、将数据库置为单用户模式在我们长期的认知中,都是绝对的“独占访问权”。但实际上,在有并发+连续访问的情况下,我们仍有可能因外部访问的死锁而丢掉这个“独占访问权”
2、进一步分析,从将数据库置为单用户模式的时候,数据库系统没有直接将Session的锁级别提升至最高(个人理解,从Alter Database触发的动作,置为SCH-X都不为过),而是温和的放置了DB级的S锁,同时对其他访问相同数据库的请求则要求申请X锁,这就导致了,当外部请求访问数据库时,先放置DB级S锁(这里和Single User Session 的DB级S锁且兼容),而后因为要申请X锁,所以和其他访问同样数据库的请求达成了死锁条件。
3、如果在应急处置中仍需要将DB置为Single User模式,建议停掉外部访问(停账号,修改实例端口号,关闭TCP\IP,禁用外部访问网卡,或者修改数据库名称),以免无法置回Multi User模式。
迷之自信的Single_User Mode的更多相关文章
- 关于我的OI生涯(AFO){NOIP2016 后}
这篇我就随意写啦~不用统一的“题解”形式.♪(^∀^●)ノ 也分好几次慢慢更吧~ 对于NOIP2016的总结,我本想善始善终back回,但是心情不足以支撑我,那就只能有始有终了......下面进入我的 ...
- 并查集(union-find set)与Kruskal算法
并查集 并查集处理的是集合之间的关系,即‘union' , 'find' .在这种数据类型中,N个不同元素被分成若干个组,每组是一个集合,这种集合叫做分离集合.并查集支持查找一个元素所属的集合和两个元 ...
- Grapher--寂寞无名的神器
承自上一篇中的函数图形,有人问,能不能别把画个图搞那么复杂,我说当然,只要你有一台mac. 话说出来很潇洒的样子,充斥着一股迷之自信. 可能这就是mac用户典型的特征,尽管也许并没有那么值得骄傲. 其 ...
- Struts hibernate Spring 框架原理
转自:http://www.cnblogs.com/javaNewegg/archive/2011/08/28/2156521.html 原理:1.通过Configuration().configur ...
- 《剑指offer》面试题39 二叉树的深度(java)
摘要: 今天翻到了<剑指offer>面试题39,题目二中的解法二是在函数的参数列表中通过指针的方式进行传值,而java是没有指针的,所以函数要进行改造.然而我翻了下别人的java版本(我就 ...
- Bzoj4763 雪辉
Time Limit: 39 Sec Memory Limit: 666 MBSubmit: 151 Solved: 80 Description 上次立下的NOIP退役Flag没有成功 这次 ...
- 九月回顾 这篇文章和ACM毫无关系= =
其实不只是九月的回顾吧,我大概想把暑假到现在10.01发生的啥事儿都说下吧~ 嗯,我是一个比较沙茶的人,不过运气比较好吧. 高中啊,这个谈起来话就长了,在校什么风采之星大赛上,我认识了个妹子,当时感觉 ...
- COGS727 [网络流24题] 太空飞行计划
[问题描述] W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合E={E1,E2,…,Em},和进行这些实验需要使用的全部仪 ...
- MongoDB的一些操作技巧
去年三月底入职上海的一家互联网公司,由于项目使用的是MongoDB数据库所以有机会接触了MongoDB.在项目的开发过程中使用系统原有的一些方法查询MongoDB感觉很费力,用起来也不爽,所以私下里就 ...
随机推荐
- pigctf期末测评
pigctf期末测评 MISC 1 拿到图片,先binwalk一下,如下图 果然发现png图片后面跟了个ZIP,然后提取出来打开发现了一个flag.png,然后查看16进制文件没有发现什么问题,之后查 ...
- Scala 基础(九):Scala 函数式编程(一)基础(一)概念、定义、调用机制
1 概念的说明 1)在scala中,方法和函数几乎可以等同(比如他们的定义.使用.运行机制都一样的),只是函数的使用方式更加的灵活多样. 2)函数式编程是从编程方式(范式)的角度来谈的,可以这样理解: ...
- java 面向对象(十一):关键字:package/import
1.1 使用说明: * 1.为了更好的实现项目中类的管理,提供包的概念 * 2.使用package声明类或接口所属的包,声明在源文件的首行 * 3.包,属于标识符,遵循标识符的命名规则.规范(xxxy ...
- python 并发专题(四):yield以及 yield from
一.yield python中yield的用法很像return,都是提供一个返回值,但是yield和return的最大区别在于,return一旦返回,则代码段执行结束,但是yield在返回值以后,会交 ...
- Java实现 LeetCode第30场双周赛 (题号5177,5445,5446,5447)
这套题不算难,但是因为是昨天晚上太晚了,好久没有大晚上写过代码了,有点不适应,今天上午一看还是挺简单的 5177. 转变日期格式 给你一个字符串 date ,它的格式为 Day Month Yea ...
- css 实现动态二级菜单
动态实现简单的二级菜单 当鼠标放到一级标签上时,鼠标会变成小手的形状 展示二级菜单,源码如下,复制即可直接使用 <!DOCTYPE html> <html lang="en ...
- 2万字长文包教包会 JVM 内存结构 保姆级学习笔记
写这篇的主要原因呢,就是为了能在简历上写个"熟悉JVM底层结构",另一个原因就是能让读我文章的大家也写上这句话,真是个助人为乐的帅小伙....嗯,不单单只是面向面试学习哈,更重要的 ...
- Java中解决继承和接口默认方法冲突
1)超类优先.如果超类提供了一个具体方法,同名而且有相同参数类型发默认方法会被忽略. 2)接口冲突.如果一个超接口提供了一个默认方法,另一个接口提供了一个同名而且参数类型(不论是否是默认参数)相同的方 ...
- nodejs--抓取页面的数据--图
感觉挺有意思,比php好玩 ----做个图留个 纪念
- ‘100%’wuxiao
有时候设置控件的width:’100%‘无效, 群友解释, 因为父控件的大小要靠自空间撑起来,确定 ??????