SQLServer2012 锁机制测试解析

SQLServer2012在查询分析器里面开两个连接

插入锁:
结论:“表锁”锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,所以Select如果不想等待就要在Select后加With(Nolock),但这样会产生脏数据就是其他事务已更新但并没有提交的数据,如果该事务进行了RollBack则取出的数据就是错误的,所以好自己权衡利弊,一般情况下90%以上的Select都允许脏读,只有账户金额相关的不允许。
------------------A连接 Insert Lock-------------------
BEGIN TRAN
INSERT INTO dbo.UserInfo
        ( Name, Age, Mobile, AddTime, Type )
VALUES  ( ‘eee‘, -- Name - varchar(50)
          2, -- Age - int
          ‘555‘, -- Mobile - char(11)
          GETDATE(), -- AddTime - datetime
          0  -- Type - int
          )

SELECT resource_type, request_mode,COUNT(*)  FROM sys.dm_tran_locks
WHERE request_session_id=@@SPID
GROUP BY resource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Insert Lock------------------------
INSERT INTO dbo.UserInfo
        ( Name, Age, Mobile, AddTime, Type )
VALUES  ( ‘fff‘, -- Name - varchar(50)
          2, -- Age - int
          ‘123‘, -- Mobile - char(11)
          GETDATE(), -- AddTime - datetime
          1  -- Type - int
          ) --可以执行插入

SELECT * FROM dbo.UserInfo --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Age=1 --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Id=3 --可以执行查询(根据主键可以)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) --可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) WHERE Age=1 --可以执行查询
UPDATE dbo.UserInfo SET Type=5 WHERE Name=‘fff‘  --需要等待解锁
DELETE FROM dbo.UserInfo WHERE Name=‘fff‘ --需要等待解锁

更新锁:
结论:“表锁”锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,
-----------------------A连接 Update Lock-----------------------
BEGIN TRAN
UPDATE dbo.UserInfo SET Name = ‘eee‘ WHERE Age = 2

SELECT resource_type, request_mode,COUNT(*)  FROM sys.dm_tran_locks
WHERE request_session_id=@@SPID
GROUP BY resource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Update Lock------------------------
INSERT INTO dbo.UserInfo
        ( Name, Age, Mobile, AddTime, Type )
VALUES  ( ‘ppp‘, -- Name - varchar(50)
          15, -- Age - int
          ‘666‘, -- Mobile - char(11)
          GETDATE(), -- AddTime - datetime
          9  -- Type - int
          ) --可以执行插入
SELECT * FROM dbo.UserInfo --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Name=‘ppp‘ --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Id=3 --可以执行查询(根据主键可以)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) --可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) WHERE Name = ‘ppp‘ --可以执行查询
UPDATE dbo.UserInfo SET Age=8 WHERE Name=‘ccc‘ --需要等待解锁
DELETE dbo.UserInfo WHERE Age = 5 --需要等待解锁

主键锁:
结论:“行锁+表锁” 锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,

------------------------A连接 Key Lock--------------------
BEGIN TRAN
UPDATE dbo.UserInfo SET Name=‘hhh‘ WHERE Id=3 --以主键为条件

SELECT resource_type, request_mode,COUNT(*)  FROM sys.dm_tran_locks
WHERE request_session_id=@@SPID
GROUP BY resource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Key Lock----------------------
INSERT INTO dbo.UserInfo
        ( Name, Age, Mobile, AddTime, Type )
VALUES  ( ‘kkk‘, -- Name - varchar(50)
          18, -- Age - int
          ‘234‘, -- Mobile - char(11)
          GETDATE(), -- AddTime - datetime
          7  -- Type - int
          ) --可以执行插入
SELECT * FROM dbo.UserInfo WITH(NOLOCK) --可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) WHERE Name = ‘kkk‘ --可以执行查询

-----//全表查询及操作正在处理的行
SELECT * FROM dbo.UserInfo --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Id=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)
UPDATE dbo.UserInfo SET Name=‘mmm‘ WHERE Id=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)
DELETE dbo.UserInfo WHERE Id=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)
-----//使用非主键为条件的操作
SELECT * FROM dbo.UserInfo WHERE Name=‘aaa‘ --需要等待解锁(非主键不可)
UPDATE dbo.UserInfo SET Name=‘ooo‘ WHERE Name=‘aaa‘ --需要等待解锁(非主键不可)
DELETE dbo.UserInfo WHERE Name=‘aaa‘ --需要等待解锁(非主键不可)
-----//使用主键为条件的操作
SELECT * FROM dbo.UserInfo WHERE id=1 --可以执行查询(根据主键可以)
UPDATE dbo.UserInfo SET Name=‘yyy‘ WHERE Id=1 --可以执行更新(根据主键可以)
DELETE dbo.UserInfo WHERE Id=1 --可以执行删除(根据主键可以)

索引锁:
结论:
------------------------A连接 Index Lock--------------------
DROP INDEX dbo.UserInfo.Index_UserInfo_Name
CREATE INDEX Index_UserInfo_Name ON dbo.UserInfo(Name)

BEGIN TRAN
UPDATE dbo.UserInfo SET age=66 WHERE Name=‘ddd‘ --使用name索引列为条件

SELECT resource_type, request_mode,COUNT(*)  FROM sys.dm_tran_locks
WHERE request_session_id=@@SPID
GROUP BY resource_type,request_mode

--ROLLBACK TRAN

----------------------B连接 Index Lock-------------------
INSERT INTO dbo.UserInfo
        ( Name, Age, Mobile, AddTime, Type )
VALUES  ( ‘iii‘, -- Name - varchar(50)
          20, -- Age - int
          ‘235235235‘, -- Mobile - char(11)
          GETDATE(), -- AddTime - datetime
          12  -- Type - int
          ) --可以执行插入
SELECT * FROM dbo.UserInfo WITH(NOLOCK) --可以执行查询(在一个事物中,有更新字段但还没有提交,此时就会查处脏数据)
SELECT * FROM dbo.UserInfo WITH(NOLOCK) WHERE Name = ‘kkk‘ --可以执行查询

-----//全表查询及操作正在处理的行
SELECT * FROM dbo.UserInfo --需要等待解锁
SELECT * FROM dbo.UserInfo WHERE Id=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)
UPDATE dbo.UserInfo SET Name=‘mmm‘ WHERE Id=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)
DELETE dbo.UserInfo WHERE Id=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)
-----//使用非主键非索引为条件的操作
SELECT * FROM dbo.UserInfo WHERE Age=5 --需要等待解锁(非主键不可)
UPDATE dbo.UserInfo SET Name=‘ooo‘ WHERE Age=5 --需要等待解锁(非主键不可)
DELETE dbo.UserInfo WHERE Age=5 --需要等待解锁(非主键不可)
-----//使用主键为条件的操作
SELECT * FROM dbo.UserInfo WHERE Id=1 --可以执行更新(根据主键可以)
UPDATE dbo.UserInfo SET Name=‘yyy‘ WHERE Id=1 --可以执行更新(根据主键可以)
DELETE dbo.UserInfo WHERE Id=1 --可以执行删除(根据主键可以)
-----//使用索引为条件的操作
SELECT * FROM dbo.UserInfo WHERE Name=‘aaa‘ --需要等待解锁(非主键不可)
UPDATE dbo.UserInfo SET Name=‘ooo‘ WHERE Name=‘aaa‘ --可以执行更新(根据索引可以)
DELETE dbo.UserInfo WHERE Name=‘aaa‘ --可以执行删除(根据索引可以)

SQLServer2012在查询分析器里面开两个连接

插入锁:

结论:“表锁”锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,所以Select如果不想等待就要在Select后加With(Nolock),但这样会产生脏数据就是其他事务已更新但并没有提交的数据,如果该事务进行了RollBack则取出的数据就是错误的,所以好自己权衡利弊,一般情况下90%以上的Select都允许脏读,只有账户金额相关的不允许。

------------------A连接 Insert Lock-------------------

BEGINTRAN

INSERTINTOdbo.UserInfo

(Name,Age,Mobile,AddTime,Type)

VALUES 
(‘eee‘,-- Name - varchar(50)

2,-- Age - int

‘555‘,-- Mobile - char(11)

GETDATE(),-- AddTime - datetime

0  -- Type - int

)

SELECTresource_type,request_mode,COUNT(*)  FROMsys.dm_tran_locks

WHERErequest_session_id=@@SPID

GROUPBYresource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Insert Lock------------------------

INSERTINTOdbo.UserInfo

(Name,Age,Mobile,AddTime,Type)

VALUES 
(‘fff‘,-- Name - varchar(50)

2,-- Age - int

‘123‘,-- Mobile - char(11)

GETDATE(),-- AddTime - datetime

1  -- Type - int

)--可以执行插入

SELECT*FROMdbo.UserInfo--需要等待解锁

SELECT*FROMdbo.UserInfoWHEREAge=1 --需要等待解锁

SELECT*FROMdbo.UserInfoWHEREId=3 --可以执行查询(根据主键可以)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)--可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)WHEREAge=1 --可以执行查询

UPDATEdbo.UserInfoSETType=5 WHEREName=‘fff‘  --需要等待解锁

DELETEFROMdbo.UserInfoWHEREName=‘fff‘--需要等待解锁

更新锁:

结论:“表锁”锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,

-----------------------A连接 Update Lock-----------------------

BEGINTRAN

UPDATEdbo.UserInfoSETName=‘eee‘WHEREAge= 2

SELECTresource_type,request_mode,COUNT(*)  FROMsys.dm_tran_locks

WHERErequest_session_id=@@SPID

GROUPBYresource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Update Lock------------------------

INSERTINTOdbo.UserInfo

(Name,Age,Mobile,AddTime,Type)

VALUES 
(‘ppp‘,-- Name - varchar(50)

15,-- Age - int

‘666‘,-- Mobile - char(11)

GETDATE(),-- AddTime - datetime

9  -- Type - int

)--可以执行插入

SELECT*FROMdbo.UserInfo--需要等待解锁

SELECT*FROMdbo.UserInfoWHEREName=‘ppp‘--需要等待解锁

SELECT*FROMdbo.UserInfoWHEREId=3 --可以执行查询(根据主键可以)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)--可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)WHEREName=‘ppp‘--可以执行查询

UPDATEdbo.UserInfoSETAge=8 WHEREName=‘ccc‘--需要等待解锁

DELETEdbo.UserInfoWHEREAge= 5 --需要等待解锁

主键锁:

结论:“行锁+表锁”锁定对该表的Select、Update、Delete操作,但不影响对该表的Insert操作也不影响以主键Id为条件的Select,

------------------------A连接 Key Lock--------------------

BEGINTRAN

UPDATEdbo.UserInfoSETName=‘hhh‘WHEREId=3 --以主键为条件

SELECTresource_type,request_mode,COUNT(*)  FROMsys.dm_tran_locks

WHERErequest_session_id=@@SPID

GROUPBYresource_type,request_mode

--ROLLBACK TRAN

------------------------B连接 Key Lock----------------------

INSERTINTOdbo.UserInfo

(Name,Age,Mobile,AddTime,Type)

VALUES 
(‘kkk‘,-- Name - varchar(50)

18,-- Age - int

‘234‘,-- Mobile - char(11)

GETDATE(),-- AddTime - datetime

7  -- Type - int

)--可以执行插入

SELECT*FROMdbo.UserInfoWITH(NOLOCK)--可以执行查询(在一个事务中,有更新字段但还没有提交,此时就会查处脏数据)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)WHEREName=‘kkk‘--可以执行查询

-----//全表查询及操作正在处理的行

SELECT*FROMdbo.UserInfo--需要等待解锁

SELECT*FROMdbo.UserInfoWHEREId=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)

UPDATEdbo.UserInfoSETName=‘mmm‘WHEREId=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)

DELETEdbo.UserInfoWHEREId=3 --需要等待解锁(根据主键,但与A连接操作相同行不可)

-----//使用非主键为条件的操作

SELECT*FROMdbo.UserInfoWHEREName=‘aaa‘--需要等待解锁(非主键不可)

UPDATEdbo.UserInfoSETName=‘ooo‘WHEREName=‘aaa‘--需要等待解锁(非主键不可)

DELETEdbo.UserInfoWHEREName=‘aaa‘--需要等待解锁(非主键不可)

-----//使用主键为条件的操作

SELECT*FROMdbo.UserInfoWHEREid=1 --可以执行查询(根据主键可以)

UPDATEdbo.UserInfoSETName=‘yyy‘WHEREId=1 --可以执行更新(根据主键可以)

DELETEdbo.UserInfoWHEREId=1 --可以执行删除(根据主键可以)

索引锁:

结论:

------------------------A连接 Index Lock--------------------

DROPINDEXdbo.UserInfo.Index_UserInfo_Name

CREATEINDEXIndex_UserInfo_NameONdbo.UserInfo(Name)

BEGINTRAN

UPDATEdbo.UserInfoSETage=66WHEREName=‘ddd‘--使用name索引列为条件

SELECTresource_type,request_mode,COUNT(*)  FROMsys.dm_tran_locks

WHERErequest_session_id=@@SPID

GROUPBYresource_type,request_mode

--ROLLBACK TRAN

----------------------B连接 Index Lock-------------------

INSERTINTOdbo.UserInfo

(Name,Age,Mobile,AddTime,Type)

VALUES 
(‘iii‘,-- Name - varchar(50)

20,-- Age - int

‘235235235‘,-- Mobile - char(11)

GETDATE(),-- AddTime - datetime

12  -- Type - int

)--可以执行插入

SELECT*FROMdbo.UserInfoWITH(NOLOCK)--可以执行查询(在一个事物中,有更新字段但还没有提交,此时就会查处脏数据)

SELECT*FROMdbo.UserInfoWITH(NOLOCK)WHEREName=‘kkk‘--可以执行查询

-----//全表查询及操作正在处理的行

SELECT*FROMdbo.UserInfo--需要等待解锁

SELECT*FROMdbo.UserInfoWHEREId=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)

UPDATEdbo.UserInfoSETName=‘mmm‘WHEREId=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)

DELETEdbo.UserInfoWHEREId=4 --需要等待解锁(根据主键,但与A连接操作相同行不可)

-----//使用非主键非索引为条件的操作

SELECT*FROMdbo.UserInfoWHEREAge=5 --需要等待解锁(非主键不可)

UPDATEdbo.UserInfoSETName=‘ooo‘WHEREAge=5 --需要等待解锁(非主键不可)

DELETEdbo.UserInfoWHEREAge=5 --需要等待解锁(非主键不可)

-----//使用主键为条件的操作

SELECT*FROMdbo.UserInfoWHEREId=1 --可以执行更新(根据主键可以)

UPDATEdbo.UserInfoSETName=‘yyy‘WHEREId=1 --可以执行更新(根据主键可以)

DELETEdbo.UserInfoWHEREId=1 --可以执行删除(根据主键可以)

-----//使用索引为条件的操作

SELECT*FROMdbo.UserInfoWHEREName=‘aaa‘--需要等待解锁(非主键不可)

UPDATEdbo.UserInfoSETName=‘ooo‘WHEREName=‘aaa‘--可以执行更新(根据索引可以)

DELETEdbo.UserInfoWHEREName=‘aaa‘--可以执行删除(根据索引可以)

时间: 2024-10-25 05:52:02

SQLServer2012 锁机制测试解析的相关文章

安卓电量优化之WakeLock锁机制全面解析

一.WakeLock概述 wakelock是一种锁的机制,只要有应用拿着这个锁,CPU就无法进入休眠状态,一直处于工作状态.比如,手机屏幕在屏幕关闭的时候,有些应用依然可以唤醒屏幕提示用户消息,这里就是用到了wakelock锁机制,虽然手机屏幕关闭了,但是这些应用依然在运行着.手机耗电的问题,大部分是开发人员没有正确使用这个锁,成为"待机杀手". Android手机有两个处理器,一个叫Application Processor(AP),一个叫Baseband Processor(BP)

Java并发编程:Concurrent锁机制解析

.title { text-align: center } .todo { font-family: monospace; color: red } .done { color: green } .tag { background-color: #eee; font-family: monospace; padding: 2px; font-size: 80%; font-weight: normal } .timestamp { color: #bebebe } .timestamp-kwd

【巨杉数据库SequoiaDB】巨杉 Tech | 并发性与锁机制解析与实践

01 概述 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性.加锁是实现数据库并发控制的一个非常重要的技术.当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁.加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作. OLTP 场景下通常要求具有很高的并发性.并发事务实际上取决于资源的使用状况,原则上应尽量减少

oracle 事务 锁机制

本课内容属于Oracle高级课程范畴,内容略微偏向理论性,但是与数据库程序开发和管理.优化密切相关:另外本课的部分内容在前面章节已经涉及,请注意理论联系实际. 事务  事务(Transaction)从 通讯的角度看:是用户定义的数据库操作序列,这些操作要么全做.要么全不做,是不可分割的一个工作单元.事务控制语句称为TCL,一般包括Commit和Rollback. 事务不是程序,事务和程序分属两个概念.在RDBMS中,一个事务可以有一条SQL语句.一组SQL语句或者整个程序:一个应用程序又通常包含

[转载] 数据库分析手记 —— InnoDB锁机制分析

作者:倪煜 InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过本文可以帮助大家了解InnoDB锁的基本原理,常见的冲突.死锁,以及对InnoDB事务日志信息的解读. 1. 索引基本原理 InnoDB主要使用行级锁(row lock),其行锁是通过在索引项上加锁而实现的,如果MySQL的执行计划没有用到索引,那么行锁也就无意义了,所以了解锁之前需要了

InnoDB锁机制分析

InnoDB锁机制常常困扰大家,不同的条件下往往表现出不同的锁竞争,在实际工作中经常要分析各种锁超时.死锁的问题.本文通过不同条件下的实验,利用InnoDB系统给出的各种信息,分析了锁的工作机制.通过本文可以帮助大家了解InnoDB锁的基本原理,常见的冲突.死锁,以及对InnoDB事务日志信息的解读. 1. 索引基本原理 InnoDB主要使用行级锁(row lock),其行锁是通过在索引项上加锁而实现的,如果MySQL的执行计划没有用到索引,那么行锁也就无意义了,所以了解锁之前需要了解一点索引原

大数据技术之_29_MySQL 高級面试重点串讲_02_Mysql 简介+Linux 版的安装+逻辑架构介绍+性能优化+性能分析+查询截取分析+分区分库分表简介+锁机制+主从复制

第1章 Mysql 简介1.1 概述1.2 高级 MySQL第2章 Mysql Linux 版的安装2.1 下载地址2.2 检查当前系统是否安装过 mysql2.3 修改 Mysql 配置文件位置2.4 修改字符集和数据存储路径2.5 MySQL 的安装位置说明2.6 Mysql 配置文件说明2.7 Mysql 的数据存放目录第3章 Mysql 逻辑架构介绍3.1 总体概览3.2 查询说明第4章 Mysql 性能优化4.1 影响 mysql 的性能因素4.2 查询与索引优化分析4.2.1 性能下

[数据库事务与锁]详解四: 数据库的锁机制

注明: 本文转载自http://www.hollischuang.com/archives/898 数据库的读现象浅析中介绍过,在并发访问情况下,可能会出现脏读.不可重复读和幻读等读现象,为了应对这些问题,主流数据库都提供了锁机制,并引入了事务隔离级别的概念. 并发控制 在计算机科学,特别是程序设计.操作系统.多处理机和数据库等领域,并发控制(Concurrency control)是确保及时纠正由并发操作导致的错误的一种机制. 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存

利用锁机制解决商品表和库存表并发问题

锁机制 问题:当一个脚本被一个客户端访问都正常,但当多个客户端同时并发访问时,这个脚本的结果会出现不正确,这个问题需要使用锁机制来解决.在我们这个网站中需要用到锁的地方就是高并发下定单时减少商品库存量时. 比如例子1: 有一个A 表里面一个ID数字: 现在写一个脚本操作这个A表,每次访问把ID减少: 这个脚使用AB模拟10个用户并发访问时会发现减少的数量并不是10: . 例子2:在高并发下定单时如果要减少库存量,那么库存就会出问题: 加锁之前: 加锁之后: 现在有两种锁机制:MYSQL中的表锁和