• Sql Server 锁


    1.排它锁
    在一个Sql连接中这样写:
    begin tran
     --select * from  a with(UPDLOCK)
     update a set [name]='wq' where [id]=2   --这里的set的值不能不变(即不能本来name='wq'又set name='wq'),否则Sql Server会优化

    成不加锁
     waitfor delay '00:00:08' 
    commit tran
    在另外一个sql连接中这样写:
    select * from a
    发现第二个连接里的sql语句必须等到第一个连接里的事务完成才执行完成,这是因为第一个连接里的update语句自动加了独占锁

    2.Sql Server 默认锁
    即INSERT、 UPDATE 或DELETE 命令时,SQL Server 会自动使用独占锁。
    Select语句:1.当事务的隔离级别为 READ  committed,READ  uncommitted 时为不加锁,既unlock 
         2.当事务的隔离级别为 REPEATABLE READ,SERIALIZABLE时,为共享锁,既HoldLock

    3.事务隔离级别:
    1.REPEATABLE READ
    在第一个Sql连接的一个事务中这样设置以后,那么在第二个Sql连接里,不能对第一个连接里事务操作的表进行update,delete操作,但是能进行

    insert操作,且新插入的行包括在第一个连接的当前事务的后续读取中
    2.SERIALIZABLE
    在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别

    较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。即在第一个Sql连接的一个事

    务中这样设置以后,那么在第二个Sql连接里,不能对第一个连接里事务操作的表进行update,delete,insert操作


    4.关于更新锁
    在一个Sql连接中这样写:
    begin tran
     begin tran
     select * from a with(updlock) where [id] in (2,3,4)
      waitfor delay '00:00:04'
    commit tran
    在另外一个sql连接中这样写:
     select * from a with(updlock) where [id] =4
    发现第二个连接里的sql语句必须等到第一个连接里的事务完成才执行完成,这是因为第二个连接的更新锁认为第一个连接里的更新锁可能会进行修改

    转换为排它锁,所以要等第一个连接的事务执行完成才执行。如果第二个连接里的sql语句这样写:select * from a with(holdlock) where [id]

    =4,则不不用等第一个连接事务执行完毕才执行。

  • 相关阅读:
    企业应用点点滴滴记入
    jQuery 图片轮播
    javascript setTimeout和setinterval的区别是?
    html5 新增的标签和废除的标签
    H​t​m​l​5​ ​学​习​:​H​T​M​L​5​新​增​结​构​标​签
    WEB前端开发人员须知的常见浏览器兼容问题及解决技巧
    jQuery 简单返回顶部代码
    css 背景色为半透明的例子
    javaScript面试题大全
    Ionic3学习笔记(五)动画之使用 animate.css
  • 原文地址:https://www.cnblogs.com/mxw09/p/1986438.html
Copyright © 2020-2023  润新知