环境: SQL Server 2005 or 2008
最近在处理一个锁的问题时,发现一个比较郁闷的事,使用X锁居然无法锁住查询,模拟这个问题,可以使用如下T-SQL脚本来建立测试环境。
USE master;
GO
IF @@TRANCOUNT > 0
ROLLBACK TRAN;
GO
-- =======================================
-- 建立测试数据库
-- a. 删除测试库, 如果已经存在的话
IF DB_ID(N'db_xlock_test') IS NOT NULL
BEGIN;
ALTER DATABASE db_xlock_test
SET SINGLE_USER
WITH
ROLLBACK AFTER 0;
DROP DATABASE db_xlock_test;
END;
-- b. 建立测试数据库
CREATE DATABASE db_xlock_test;
-- c. 关闭READ_COMMITTED_SNAPSHOT 以保持SELECT 的默认加锁模式
ALTER DATABASE db_xlock_test
SET READ_COMMITTED_SNAPSHOT OFF;
GO
-- =======================================
-- 建立测试表
USE db_xlock_test;
GO
CREATE TABLE dbo.tb(
id int IDENTITY
PRIMARY KEY,
name sysname
);
INSERT dbo.tb
SELECT TOP(50000)
O1.name + N'.' + O2.name + N'.' + O3.name
FROM sys.objects O1 WITH(NOLOCK),
sys.objects O2 WITH(NOLOCK),
sys.objects O3 WITH(NOLOCK);
GO
然后,建立一个连接,执行下面的脚本来实现加锁。
-- =======================================
-- 测试连接1 - 加锁
BEGIN TRAN
--测试的初衷是通过SELECT加锁,结果发现UPDATE也锁不住
UPDATE dbo.tb SET name = name
--SELECT COUNT(*) FROM dbo.tb WITH(XLOCK)
WHERE id <= 2;
SELECT
spid = @@SPID,
tran_count = @@TRANCOUNT,
database_name = DB_NAME(),
object_id = OBJECT_ID(N'dbo.tb', N'Table');
-- 显示锁
EXEC sp_lock @@SPID;
通过执行结果,可以看到对象被加锁的情况:表级和页级上是IX锁,记录上是X锁。
spid
|
tran_count
|
database_name
|
object_id
|
|
51
|
1
|
db_xlock_test
|
21575115
|
|
spid
|
dbid
|
ObjId
|
IndId
|
Type
|
Resource
|
Mode
|
Status
|
51
|
7
|
0
|
0
|
DB
|
|
S
|
GRANT
|
51
|
7
|
21575115
|
1
|
PAG
|
0.095138889
|
IX
|
GRANT
|
51
|
7
|
21575115
|
0
|
TAB
|
|
IX
|
GRANT
|
51
|
1
|
1131151075
|
0
|
TAB
|
|
IS
|
GRANT
|
51
|
7
|
21575115
|
1
|
KEY
|
(020068e8b274)
|
X
|
GRANT
|
51
|
7
|
21575115
|
1
|
KEY
|
-10086470766
|
X
|
GRANT
|
|
|
|
|
|
|
|
|
|
|
|
然后新建一个连接,执行下面的T-SQL查询,看看会否被连接1锁住
-- =======================================
-- 测试连接2 - 被阻塞(在测试连接1 执行后执行)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SELECT * FROM dbo.tb
WHERE id <= 2;
上述查询会很快返回结果,并不会被查询1阻塞住。
按照我们的了解(联机帮助上也有说明),在READ COMMITTED事务隔离级别下,查询使用共享锁(S),而根据锁的兼容级别,S锁是与X锁冲突的,所以正常情况下,连接2的查询需要等待连接1执行完成。可是测试的结果去违反了这一原则。
为了了解为什么连接2不会被阻塞,对连接2做了一个Trace,发现一个更郁闷的问题,Trace的结果如下:
EventClass
|
TextData
|
ObjectID
|
Type
|
Mode
|
Lock:Acquired
|
|
21575115
|
5 - OBJECT
|
6 - IS
|
Lock:Acquired
|
1:77
|
0
|
6 - PAGE
|
6 - IS
|
Lock:Acquired
|
[PLANGUIDE]
|
0
|
2 - DATABASE
|
3 - S
|
Lock:Acquired
|
|
21575115
|
5 - OBJECT
|
6 - IS
|
Lock:Acquired
|
1:77
|
0
|
6 - PAGE
|
6 - IS
|
Lock:Acquired
|
1:80
|
0
|
6 - PAGE
|
6 - IS
|
Lock:Acquired
|
width
分享到:
Global site tag (gtag.js) - Google Analytics
|
相关推荐
此时 1 秒 6000 个请求全部落数据库,数据库必然扛不住,它会报一下警,真实情况可能 DBA 都没反应过来就直接挂了。 解决方案处理缓存雪崩简单,在批量往 Redis 存数据的时候,把每个 Key 的失效时间都加个随机值就...
标题中的"endnote-template-cnzhx-EndNote X9.1-论文用-方便您查询论文-doc-office集成插件"表明这是一个针对中国用户的EndNote X9.1版本的模板,特别优化了中文环境下的使用体验,适用于论文写作。"cnzhx"可能代表...
用户在安装“EndNote X9.1-论文用-方便您查询论文-doc-office集成插件.exe”文件后,即可享受到这些新特性。 总的来说,EndNote X9.1是科研工作者和学生不可或缺的工具,它不仅提供了全面的文献检索和管理功能,还...
最后,"endnote_template_cnzhx-EndNote X9.1-论文用-方便您查询论文-doc-office集成插件.zip"可能是针对中文用户的模板或插件包,包含了一些预设的中文文献引用样式和配置,便于中文论文的撰写。 综上所述,这个...
MySQL 是一款广泛使用的开源关系型数据库管理系统,适合于存储、查询、更新和管理各种类型的数据。面试中,数据库程序员常会被问及关于 MySQL 的基础知识,如数据去重、多表连接、与 Redis 的区别、索引的优势和劣势...
Gremlin Console是TinkerPop提供的一种基于命令行的交互式环境,用户可以在这个环境中编写、测试和执行Gremlin查询语言。Gremlin是一种强大的图遍历语言,用于操作图结构的数据。在3.4.0版本中,你可以期待一系列的...
如系统功能模块简介展示了APP的整体架构,系统登录、工作台、日志查询和系统管理等模块则是具体的操作流程。系统登录是用户进入应用的第一步,要求有安全的身份验证机制;工作台作为用户的主要交互界面,需展示关键...
- 调度操作及查询:解释如何进行调度操作,如指派订单、查看调度历史,以及如何查询特定订单的状态。 该文档的目的是提供一个全面的需求框架,以指导开发团队构建一个高效、灵活且易于使用的订单调度系统。项目...
同时,为了使模板在不同设备上看起来效果良好,可能运用了媒体查询(`@media`)来实现自适应布局。 JavaScript则是实现交互性和动态功能的关键。在这个博客模板中,可能使用JavaScript来处理用户交互,如导航菜单的...
媒体查询(@media query)是实现这一目标的关键工具。 然后是JavaScript。虽然在描述中没有明确提及,但js标签暗示了JavaScript在模板中的使用。JavaScript通常用于增加网页的动态性和交互性。在这个个人简历模板中...
15. 数据库:如果修改涉及到数据库,会列出相关的表、字段和查询等信息。 通过这份报告书,团队可以清晰地了解每次修改的目的、内容和结果,确保软件质量的持续提升。此外,这也符合软件工程的迭代开发原则,即每次...
模板可能采用了媒体查询、弹性网格布局和可伸缩的图像等技术来实现响应式设计,确保在任何设备上都能提供一致的视觉效果和操作体验。 图片素材售卖网站通常需要有强大的图片展示功能,例如缩略图预览、高分辨率查看...
在学习过程中,初学者应掌握如何使用CSS选择器来控制不同元素的样式,以及如何使用媒体查询(Media Queries)进行响应式设计,使博客在不同设备上都能有良好的展示效果。同时,了解和运用现代布局方法,如Flexbox或...
【标题】"qilin-kibana-6.0.0-linux-x86_64-qilin.rar" 指向的是一个针对中标麒麟操作系统的Kibana定制版本,其压缩...在使用过程中,用户可以通过Kibana的Web界面连接到Elasticsearch,进行数据查询、分析和可视化。
利用媒体查询(`@media query`)可以根据屏幕尺寸调整布局,例如,手机端可能需要将二栏变为一栏布局。 总之,“纯html模板-咖啡色调个人博客CSS模板”是一个融合了HTML结构和CSS美学的优秀示例,它教会我们如何...
6. **响应式设计**:借助`@media`查询,根据设备屏幕尺寸调整样式,确保博客在手机、平板和桌面电脑上的表现一致。 除此之外,"web2.0"标签暗示了这个模板可能采用了Web 2.0的设计风格,强调互动性、个性化和社交...
同时,CSS3的媒体查询也可能被用于实现响应式设计,使网站在不同设备上都能良好显示。 3. 响应式布局:由于是用于个人博客,模板可能采用了流式布局或者网格系统,确保在手机、平板电脑和桌面电脑上都有良好的用户...
这通常通过媒体查询(media queries)在CSS中实现,确保在各种设备上都能良好显示。 7. **学习资源**: 这个模板对于初学者来说是一个很好的学习资源,他们可以通过研究代码了解HTML5和JavaScript在实际项目中的应用...
响应式设计使用媒体查询(@media queries)来根据设备视口大小调整布局,确保在手机、平板电脑和桌面设备上都有良好的用户体验。 4. **Java关联**:虽然标题中包含“Java”,但在HTML模板中,Java通常不直接用于...
如果一切正常,脚本应该能成功建立连接并执行查询。 请注意,配置过程中可能会遇到依赖问题,如缺少某些库或工具。在这种情况下,使用包管理器(如`apt-get`或`yum`)安装所需的依赖。此外,确保所有操作都在具有...