zoukankan      html  css  js  c++  java
  • 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 该表,其他的记录还可以正常的操作

  • 相关阅读:
    说说你对集成测试中自顶向下集成和自底向上集成两个策略的理解,要谈出它们各自的优缺点和主要适应于哪种类型测试;
    通过画因果图来写测试用例的步骤为___、___、___、___及把因果图转换为状态图共五个步骤。&#160;利用因果图生成测试用例的基本步骤是:
    性能测试的流程?
    简述bug的生命周期?
    主键、外键的作用,索引的优点与不足?
    循序渐进VUE+Element 前端应用开发(30)--- ABP后端和Vue+Element前端结合的分页排序处理(转载)
    循序渐进VUE+Element 前端应用开发(31)--- 系统的日志管理,包括登录日志、接口访问日志、实体变化历史日志(转载)
    黑盒测试和白盒测试是软件测试的两种基本方法,请分别说明各自的优点和缺点!     
    如何测试一个纸杯?
    测试计划工作的目的是什么?测试计划文档的内容应该包括什么?其中哪些是最重要的?
  • 原文地址:https://www.cnblogs.com/colder/p/4368190.html
Copyright © 2011-2022 走看看