zoukankan      html  css  js  c++  java
  • 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,则不不用等第一个连接事务执行完毕才执行。

  • 相关阅读:
    考研复试之dp重温
    面试总结
    决策树学习记录
    python机器学习随笔
    大三狗重新复习算法之递推
    第十二届CSP总结
    unity(Exploder插件)研究
    unity学习笔记2
    Unity3d学习笔记(持续更新)。。。
    4.24
  • 原文地址:https://www.cnblogs.com/mxw09/p/1986438.html
Copyright © 2011-2022 走看看