数据库记录锁表锁实际研究笔记 --- 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等等)的争用之外,数据也是一 ...
随机推荐
- Git/Github的使用以及与Eclipse的整合
Git简介 Git是一个免费的.分布式的版本控制工具,或是一个强调了速度快的源代码管理工具.每一个Git的工作目录都是一个完全独立的代码库,并拥有完整的历史记录和版本追踪能力,不依赖于网络 ...
- SqlServer整库备份还原脚本
最近领导要求定时备份数据库(不是我的作业), 搜了一下资料还不少, 先mark一下, 得空再验证吧!!! 以下内容为转载 转自:https://www.cnblogs.com/want990/p/74 ...
- 进阶之路(基础篇) - 005 模拟PWM波控制引脚
/********************************* 代码功能:输出PWM波控制引脚 使用函数: 创作时间:2016*10*07 作者邮箱:jikexianfeng@outlook.c ...
- react.js 测试
<html> <head> <title>hellow</title> <script src="ht ...
- 【Smali】Smali文件的动态调试
1.简介 smalidea是一个IntelliJ IDEA/Android Studio smali语言插件,可实现动态调试smali代码.下载地址为:https://github.com/Jesus ...
- 【Oracle】使用dbms_job包创建Oracle定时任务
在Oracle的包里面,有一个名字叫做DBMS_JOB的包,它的作用是安排和管理作业队列.通过作业队列,可以让Oracle数据库定期执行特定的任务.当使用DBMS_JOB管理作业的时候, ...
- Eclipse中创建Maven多模块工程
1.先创建父项目 在Eclipse里面New -> Maven Project: 在弹出界面中选择“Create a simple project” 这样,我们就按常规模版创建了一个Maven工 ...
- java JDK JRE 1.6,1.7,1.8各个版本版本下载链接
有时想找jdk的某个版本并不太好找,在此给出所有链接及对应的api JavaSE 1.6各个版本 jdk api http://www.Oracle.com/technetwork/Java/jav ...
- Docker 简单查看name和ip
原文地址:https://blog.csdn.net/wen_1108/article/details/78282268 查看docker name: sudo docker inspect -f=' ...
- 【C语言】练习1-23
题目来源:<The C programming language>中的习题 练习1-23: 写一个删除C语言程序中所有的注释语句.要正确处理带引号的字符串与字符常量.在C语言中,注释不 ...