数据库记录锁表锁实际研究笔记 --- MSSQLSERVER
直切主题
现有一张表
table : 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连接
begin tran t1
insert into ChenJi (DanWeiID, Name, ChenJi) values (3, ‘张三', 98)
rollback tran t1
B连接
插入与锁
先开始A连接的事务,不急着结束事务
然后在B连接中 依次执行如下一些语句
1.insert into ChenJi (DanWeiID, Name, ChenJi) values (3, ‘李四', 99) 可以执行插入语句
2.select * from ChenJi 需要等待
3.select * from ChenJi where Name = 'aa' 需要等待
3.update ChenJi SET ChenJi = 91 WHERE Name = 'aa' 需要等待
4.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连接中 依次执行如下一些语句
1. update ChenJi SET ChenJi = 91 WHERE Name = 'aa' 需要等待
2.select * from ChenJi where Name = 'aa' 需要等待
3.select * from ChenJi where Name = 'bb' 需要等待
4.select * from ChenJi where ChenJi =0 需要等待
5.update ChenJi SET ChenJi = 91 WHERE Name = 'bb' 需要等待
6.delete from ChenJi where Name = 'bb'需要等待
7.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连接中 依次执行如下一些语句
1. update ChenJi SET ChenJi = 91 WHERE Name = 'aa' 需要等待
2.select * from ChenJi where Name = 'aa' 需要等待
3.select * from ChenJi where ID = 1 需要等待 --因为name = ‘aa’
4.select * from ChenJi where ChenJi =0 需要等待
5.update ChenJi SET ChenJi = 91 WHERE Name = 'bb' 可以执行
6.delete from ChenJi where Name = 'bb' 可以执行
7.insert into ChenJi (ID, DanWeiID, Name, ChenJi) values (100, 3, 'ymf', 98) 可以执行语句
8.update ChenJi SET ChenJi = 91 WHERE ID = 2 可以执行
9.select * from ChenJi where ID = 2 可以执行
10.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连接中 依次执行如下一些语句
1. update ChenJi SET ChenJi = 91 WHERE Name = 'aa' 需要等待
2.select * from ChenJi where Name = 'aa' 需要等待
3.select * from ChenJi where Name = 'bb' 可以执行
4.select * from ChenJi where ChenJi =0 需要等待
5.update ChenJi SET ChenJi = 91 WHERE Name = 'bb' 可以执行
6.delete from ChenJi where Name = 'bb' 可以执行
7.insert into ChenJi (ID, DanWeiID, Name, ChenJi) values (100, 3, 'ymf', 98) 可以执行语句
8.update ChenJi SET ChenJi = 91 WHERE ID = 2 可以执行
9.select * from ChenJi where ID = 2 可以执行
10.delete from ChenJi where ID = 2 可以执行
研究发现如果在一个表中进行了开启事务执行更新语句并用了索引字段做条件,会对这个表的条件对应的记录select ,update,delete进行排斥锁定,是其他连接中还可以进行insert 该表,其他的记录还可以正常的操作
数据库记录锁表锁实际研究笔记 --- MSSQLSERVER的更多相关文章
- MySQL 行锁 表锁机制
MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整的很惨!不知坑在何方?没事,我来给你们标记几个坑.遇到了可别乱踩.通过本章内容,带你学习MySQL的行锁 ...
- MySQL锁(表锁,行锁,共享锁,排它锁,间隙锁)使用详解
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
- mysql 行锁 表锁
MySQL数据库 - 引擎: - innodb - 支持事务 - 锁 - 行锁 - 表锁 - 示例: - 终端: begin; select xx from xx for update; commit ...
- 浅谈SQL Transaction在请求中断后的行锁表锁
最近在维护Web Service接口时,由于数据数据量达到千万级别,接口调用不时出现错误让人不胜烦恼,经过性能测试查出瓶颈在数据库数据处理上,可着实忙了一番.相信众多程序猿和DBA都会头痛性能的问题, ...
- 【MySQL 读书笔记】全局锁 | 表锁 | 行锁
全局锁 全局锁是针对数据库实例的直接加锁,MySQL 提供了一个加全局锁的方法, Flush tables with read lock 可以使用锁将整个表的增删改操作都锁上其中包括 ddl 语句,只 ...
- [转]MySQL 表锁和行锁机制
本文转自:http://www.cnblogs.com/itdragon/p/8194622.html MySQL 表锁和行锁机制 行锁变表锁,是福还是坑?如果你不清楚MySQL加锁的原理,你会被它整 ...
- 对mysql乐观锁、悲观锁、共享锁、排它锁、行锁、表锁概念的理解
乐观锁 乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了. 实现: 通常实现是 ...
- MySQL学习之——锁(行锁、表锁、页锁、乐观锁、悲观锁等)
转载. https://blog.csdn.net/mysteryhaohao/article/details/51669741 锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是 ...
- MySQL锁(行锁、表锁、页锁、乐观锁、悲观锁等)
锁,在现实生活中是为我们想要隐藏于外界所使用的一种工具.在计算机中,是协调多个进程或县城并发访问某一资源的一种机制.在数据库当中,除了传统的计算资源(CPU.RAM.I/O等等)的争用之外,数据也是一 ...
随机推荐
- ios中滚动页面
- (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { int width=frame. ...
- 架构-虚拟路由器冗余协议【原理篇】VRRP详解
转自:http://zhaoyuqiang.blog.51cto.com/6328846/1166840/ 为什么要使用VRRP技术 我们知道,为了实现不同子网之间的设备通信,需要配置路由.目前常用的 ...
- (原)PyTorch中使用指定的GPU
转载请注明出处: http://www.cnblogs.com/darkknightzh/p/6836568.html PyTorch默认使用从0开始的GPU,如果GPU0正在运行程序,需要指定其他G ...
- 怎么样入门python?来自知乎
作者:谢科链接:https://www.zhihu.com/question/20899988/answer/24923424来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
- JAVA操作mysql(如何更加面向对象的操作数据库)
既然谈到面向对象,所以,先把连接信息给搞个对象出来: public class DBInfo { private String driver; private String host; private ...
- SpringBoot配置属性之Security
SpringBoot配置属性系列 SpringBoot配置属性之MVC SpringBoot配置属性之Server SpringBoot配置属性之DataSource SpringBoot配置属性之N ...
- dataset string dataset
DataSet ds = new DataSet(); ds.ReadXml(dataFile); Console.WriteLine(data.Length); string dataxml = d ...
- 使用ant优化android项目编译速度,提高工作效率
1.Android项目编译周期长,编译项目命令取消困难 2.在进行Android项目的编译的同时,Eclipse锁定工作区不能进行修改操作 3.在只进行资源文件的修改时,Eclipse对资源文件的修改 ...
- 模型验证组件 FluentValidation
FluentValidation 是 .NET 下的模型验证组件,和 ASP.NET MVC 基于Attribute 声明式验证的不同处,其利用表达式语法链式编程,使得验证组件与实体分开.正如 Flu ...
- TripleDES之C#和PHP之间加密解密
在C#常用加密解密一文中,介绍了几个加密解密方法,其中有个如何使用对称加密算法DES,此次说下DES的升级版,TripleDES. DES和TripleDES之间的关系可以参考下面的博文. 对称加密D ...