MS SQL SERVER 锁研究记录

首先创建一直数据表 ChenJi,有如下字段:

ID, DanWeiID,  Name,  ChenJi

CREATE TABLE [dbo].[ChenJi](
[ID] [int] NOT NULL,
[DanWeiID] [int] NULL,
[Name] [varchar](50) NULL,
[ChenJi] [varchar](50) NULL,
CONSTRAINT [PK_ChenJi] PRIMARY KEY CLUSTERED 
(
[ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

 

 

表中记录

ID  DanWeiID    Name      ChenJi 
--- ----------- --------- --------- 
1   1           aa        91 
2   1           bb        91 
3   1           cc        33 
4   2           dd        164 
5   2           ee        155 
6   2           ff        166

 

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

A连接

begin tran t1

insert into ChenJi (DanWeiID, Name, ChenJi) values (3, ‘张三', 98)

rollback tran t1

 

插入与锁

先开始A连接的事务,不急着结束事务

然后在B连接中 依次执行如下一些语句

 

insert into ChenJi (DanWeiID, Name, ChenJi) values (3, ‘李四', 99)  --可以执行插入语句

select * from ChenJi --需要等待

select * from ChenJi where Name = 'aa' --需要等待

update ChenJi SET ChenJi = 91 WHERE Name = 'aa' -- 需要等待

delete from ChenJi where Name = 'aa' --需要等待

 

研究发现如果在一个表中进行了开启事务执行插入语句,会对这个表的select ,update,delete进行排斥锁定,但是其他连接中还可以进行insert 该表

 

更新与锁

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

A连接

begin tran t1

update ChenJi SET ChenJi = 91 WHERE Name = 'aa'

rollback tran t1

 

 

先开始A连接的事务,不急着结束事务

然后在B连接中 依次执行如下一些语句

 update ChenJi SET ChenJi = 91 WHERE Name = 'aa' --需要等待

select * from ChenJi where Name = 'aa' --需要等待

select * from ChenJi where Name = 'bb' --需要等待

select * from ChenJi where ChenJi =0 --需要等待

update ChenJi SET ChenJi = 91 WHERE Name = 'bb'  --需要等待

delete from ChenJi where Name = 'bb' --需要等待

insert into ChenJi (ID, DanWeiID, Name, ChenJi) values (100, 3, 'ymf', 98) --可以执行插入语句

 

研究发现如果在一个表中进行了开启事务执行更新语句,会对这个表的select ,update,delete进行排斥锁定,但是其他连接中还可以进行insert 该表

 

 

主键与锁

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

在ChenJi表上面加入主键ID int类型

A连接

begin tran t1

update ChenJi SET ChenJi = 91 WHERE ID = 1

rollback tran t1

 

先开始A连接的事务,不急着结束事务

然后在B连接中 依次执行如下一些语句

update ChenJi SET ChenJi = 91 WHERE Name = 'aa' --需要等待

select * from ChenJi where Name = 'aa' --需要等待

select * from ChenJi where ID = 1 --需要等待  --因为name = ‘aa’

select * from ChenJi where ChenJi =0 --需要等待

update ChenJi SET ChenJi = 91 WHERE Name = 'bb'  --可以执行

delete from ChenJi where Name = 'bb' --可以执行

insert into ChenJi (ID, DanWeiID, Name, ChenJi) values (100, 3, 'ymf', 98) --可以执行语句

update ChenJi SET ChenJi = 91 WHERE ID = 2 --可以执行

select * from ChenJi where ID = 2  --可以执行

delete from ChenJi where ID = 2  --可以执行

研究发现如果在一个表中进行了开启事务执行更新语句并用了主键做条件,会对这个表的主键对应的记录select ,update,delete进行排斥锁定,是其他连接中还可以进行insert 该表,其他的记录还可以正常的操作

 

 

索引锁

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

在ChenJi表上面对Name字段进行索引<不是唯一性的索引>, ID依旧是主键

 

A连接

begin tran t1

update ChenJi SET ChenJi = 91 WHERE name = ‘aa’

rollback tran t1

 

 

先开始A连接的事务,不急着结束事务

然后在B连接中 依次执行如下一些语句

update ChenJi SET ChenJi = 91 WHERE Name = 'aa' --需要等待

select * from ChenJi where Name = 'aa' --需要等待

select * from ChenJi where Name = 'bb' --可以执行

select * from ChenJi where ChenJi =0 --需要等待

update ChenJi SET ChenJi = 91 WHERE Name = 'bb'  --可以执行

delete from ChenJi where Name = 'bb' --可以执行

insert into ChenJi (ID, DanWeiID, Name, ChenJi) values (100, 3, 'ymf', 98) --可以执行语句

update ChenJi SET ChenJi = 91 WHERE ID = 2 --可以执行

select * from ChenJi where ID = 2  --可以执行

delete from ChenJi where ID = 2  --可以执行

 

 研究发现如果在一个表中进行了开启事务执行更新语句并用了索引字段做条件,会对这个表的条件对应的记录select ,update,delete进行排斥锁定,是其他连接中还可以进行insert 该表,其他的记录还可以正常的操作

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值