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 该表,其他的记录还可以正常的操作
MS SQL SERVER 锁研究记录的更多相关文章
- MS SQL SERVER 中的系统表
MS SQL SERVER 中的系统表 序号 名称 说明 备注 1 syscolumns 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行. 2 syscomments 包含每 ...
- (火炬)MS SQL Server数据库案例教程
(火炬)MS SQL Server数据库案例教程 创建数据库: CREATE DATABASE TDB //数据库名称 ON ( NAME=TDB_dat,//逻辑文件名 在创建数据库完成之后语句中引 ...
- Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码)
Linux下使用FreeTDS访问MS SQL Server 2005数据库(包含C测试源码) http://blog.csdn.net/helonsy/article/details/7207497 ...
- 在易语言中调用MS SQL SERVER数据库存储过程方法总结
Microsoft SQL SERVER 数据库存储过程,根据其输入输出数据,笼统的可以分为以下几种情况或其组合:无输入,有一个或多个输入参数,无输出,直接返回(return)一个值,通过output ...
- [转]了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密_Mr_Indigo的空间
了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密 关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修 ...
- ms sql server 在abator生成的 insert 无法获取插入 id 的原因
<insert id="abatorgenerated_insert" parameterClass="net.xxxxxl.dataobject.Users&qu ...
- MS SQL Server时间常用函数
SQLServer时间日期函数详解,SQLServer,时间日期, 1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础 ...
- 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密
关系型数据库,如SQL Server,使用锁来避免多用户修改数据时的并发冲突.当一组数据被某个用户锁定时,除非第一个用户结束修改并释放锁,否则其他用户就无法修改该组数据. 有些数据库,包括SQL Se ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
随机推荐
- C++类型转化分析(1)
仔细想想地位卑贱的类型转换功能(cast),其在程序设计中的地位就象goto语句一样令人鄙视.但是它还不是无法令人忍受,因为当在某些紧要的关头,类型转换还是必需的,这时它是一个必需品. 不过C风格的类 ...
- 如何解决php 生成验证码图片不显示问题
最近遇到一个问题,就是验证码在别人的电脑上可以显示,但是我自己的电脑上去不能.原因找了好久,哈哈,终于找到了!现在给大家分享一下: 程序: <?php $w = 80; //设置图片宽和高 $h ...
- 取消svn关联
把下面这段文字保存成一个reg文件 Windows Registry Editor Version 5.00[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Folder\sh ...
- ssh2 php扩展
如何通过PHP启动和关闭远程服务器上的某个软件,譬如Memcached.对于俺这个刚刚掌握PHP编程皮毛的菜鸟来说,最直接不过的想法就是用exec函数执行SSH命令呗,先把运行Apache+PHP的服 ...
- Qt中sleep()的实现(耳目一新的两种方法)
在Qt中并没有Sleep函数可以调用,在程序编写时往往需要休眠几秒,这里举出两个方法,不知道是否啥不良隐患没~~ 方法一: class SleeperThread : public QThread{p ...
- SQL Server存储机制二
http://blog.csdn.net/ltylove2007/article/details/21084585 http://www.cnblogs.com/anding/p/3254674.ht ...
- .NET:OrderBy和ThenBy
.NET中OrderBy和ThenBy的语义是不同的,如:list.OrderBy(x=>x.A).OrderBy(x=>x.B),那么最终只会根据B进行排序:list.OrderBy(x ...
- Android笔记:利用InputStream和BufferedReader 进行字节流 字符流处理
通过socket获取字节流处理时最初使用的是BufferedReader和PrintWriter 这种方式在解析字符串时是比较方便的 但是在处理字节时不够方便最终还是回归到InputStream和O ...
- (leetcode)Summary Ranges
Given a sorted integer array without duplicates, return the summary of its ranges. For example, give ...
- Surround the Trees---hdu1392(凸包GraHam模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1392 题意:有n棵树,每棵树有一个坐标,想用一些绳子把这些树包含起来,求需要绳子的长度: 就是求凸包的 ...