MS SQL SERVER 锁研究记录
2015-03-26 11:39
330 查看
首先创建一直数据表 ChenJi,有如下字段:
ID, DanWeiID, Name, ChenJi
表中记录
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连接
然后在B连接中 依次执行如下一些语句
研究发现如果在一个表中进行了开启事务执行插入语句,会对这个表的select ,update,delete进行排斥锁定,但是其他连接中还可以进行insert 该表
A连接
先开始A连接的事务,不急着结束事务
然后在B连接中 依次执行如下一些语句
研究发现如果在一个表中进行了开启事务执行更新语句,会对这个表的select ,update,delete进行排斥锁定,但是其他连接中还可以进行insert 该表
在ChenJi表上面加入主键ID int类型
A连接
先开始A连接的事务,不急着结束事务
然后在B连接中 依次执行如下一些语句
研究发现如果在一个表中进行了开启事务执行更新语句并用了主键做条件,会对这个表的主键对应的记录select ,update,delete进行排斥锁定,是其他连接中还可以进行insert 该表,其他的记录还可以正常的操作
在ChenJi表上面对Name字段进行索引<不是唯一性的索引>, ID依旧是主键
A连接
先开始A连接的事务,不急着结束事务
然后在B连接中 依次执行如下一些语句
研究发现如果在一个表中进行了开启事务执行更新语句并用了索引字段做条件,会对这个表的条件对应的记录select ,update,delete进行排斥锁定,是其他连接中还可以进行insert 该表,其他的记录还可以正常的操作
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 该表,其他的记录还可以正常的操作
相关文章推荐
- MS SQLSERVER中如何快速获取表的记录总数
- 1次插入多条记录的方法(SQL语句,在MS SQL Server 2000查询分析器中执行成功)
- 两个查询指定范围的记录的SQL语句(MS SQL SERVER 2005)
- MS SQLSERVER 2000 中如何快速获取表的记录总数
- MS SQLSERVER中如何快速获取表的记录总数
- MS SQLSERVER中如何快速获取表的记录总数
- MS SQL SERVER中如何快速获取表的记录总数
- asp中如何在ms sql server中更新或添加一条记录后立即得到其标识列的值
- 转载:MS SQL Server 获得所有表的表记录,和使用空间的SQL
- MS Sql Server 作业编辑报错以及不显示历史记录
- MS SQLSERVER中如何快速获取表的记录总数
- MS SQLSERVER中如何快速获取表的记录总数
- MS SQL Server和Access分别取得随机记录(随机抽题)之完美篇
- asp中如何在ms sql server中更新或添加一条记录后立即得到其标识列的值
- MS SQLSERVER中如何快速获取表的记录总数
- MS SQLSERVER中如何快速获取表的记录总数
- 在编写触发器事件时如何获得当前插入记录的字段值?(MS SQL Server)
- MS SQLSERVER和ORACLE中取出表中按照某字段排序的前N条记录
- ms sql server 日常sql记录
- 如何查询数据库中ID的最新的一条记录 - MS-SQL Server / 基础类