zoukankan      html  css  js  c++  java
  • Transaction And Lock--锁相关基础


    --=======================================================
    --锁提示
    --holdlock :将共享锁保留到事务完成,而不是在相应的表、行或数据页不需要时就立即释放锁。holdlock等同于serializable

    --pagelock   :在通常使用单个表锁的地方采用页锁

    --nolock   :不要发出共享锁,并且不要提供排他锁。当此选项生效时,可能会读取未提交的事务或一组在读取中间回滚的页面。
    --有可能发生脏读。仅应用于select语句;NOLOCK在查询数据时不会被U锁阻塞,但是会被SCH-M锁阻塞;NOLOCK在任何事务隔离级别下效果都一样。
    --对于数据变化较快或数据拆分较频繁的时候,应考虑WITH(NOLOCK)带来的脏数据影响(数据丢失和数据重复读取),可以考虑使用SNAPSHOT来代替WITH(NOLOCK)

    --readcommitted(有用)   :指定语句不能读取已由其他事务修改但尚未提交的数据,默认情况下,mssql在此隔离级别上操作

    --readpast  :跳过锁定行。此选项导致事务跳过其他事务锁定的行(这些行平常会显示在结果集内),而不是阻塞该事务,
    --使其等待其他事务释放在这些行上的锁。readpast锁提示仅适用于运行在提交读隔离级别的事务,并且只在行级别锁之后读取,仅适用于select语句

    --repeatableread:用于运行在可重复读隔离级别的事务相同的锁语义执行扫描

    --rowlock(有用 update delect):使用行级锁,而不使用粒度更粗的页级锁和表级锁

    --tablock:使用表锁代替粒度更细的行级锁或页级锁。在语句结束前,mssql一直持有该锁。但是,如果同时指定holdlock,那么在事务结束之前,锁
    --将被一直持有

    --tablockx:使用表的排他锁。该锁可以防止其他事务读取或更新表,并在语句或事务结束前一直持有

    --updlock(有用 select ):读取表时使用更新锁,而不使用共享锁,并将锁一直保留到语句或事务的结束。updlock的优点是允许读取数据(不阻塞其他事务)并在以后
    --更新数据,同时确保自从上次读取数据后数据没有被更改

    --xlock:使用排他锁并一直保持到由语句处理的所有数据上的事务结束时。可以使用pagelock或tablock指定该锁,这种情况下排他锁适用于适当级别的粒度

    --=====================================================================================
    --SQL Server 锁
    --如果双方都在等待对方释放排他锁,SQL在确保另一个进程得以执行的情况下,自动牺牲第二个进程
    --7种:共享锁、排他锁、更新锁、意向锁、架构锁、大容量更新锁、键范围锁
    --1、共享锁(S锁 share lock):只读(可以升级到排他锁)
    --2、排他锁(X锁,exclusive lock):修改
    --3、更新锁(U锁,update lock):一个进程更新,另一个进程可以读取(不能更新),有效防止多个事务从共享锁向排他锁升级时可能出现的死锁
    --4、意向锁(intend lock):由数据库引擎自动施加
    --5、架构锁(sch lock):应用于DDL语言数据定义语言的相关锁称作架构锁 ,架构对象(列、表、视图)1、架构修改锁 2、架构稳定锁
    --6、大容量更新锁(bulk update lock):当将大量数据插入到表,而且指定了 tablelock 或者
    --EXEC sys.sp_tableoption  @TableNamePattern = N'dbo.Parts', -- nvarchar(776)
    --    @OptionName = 'table lock on bulk', -- varchar(35)
    --    @OptionValue = '1' -- varchar(12)
    --表选项时将使用大容量更新锁
    --7、键范围锁(range lock):针对索引
    --8、自定义锁

    --==============================================================================

    1.数据库引擎不会将行锁或键范围锁升级到页锁,而是将它们直接升级到表锁。同样,页锁始终升级到表锁。

    2.如果没有使用 ALTER TABLE SET LOCK_ESCALATION 选项来禁用表的锁升级并且满足以下任一条件时,则将触发锁升级:
    a>单个 Transact-SQL 语句在单个无分区表或索引上获得至少 5,000 个锁。
    b>单个 Transact-SQL 语句在已分区表的单个分区上获得至少 5,000 个锁,并且 ALTER TABLE SET LOCK_ESCALATION 选项设为 AUTO。
    数据库引擎实例中的锁的数量超出了内存或配置阈值。
    c>如果由于锁冲突导致无法升级锁,则数据库引擎每当获取 1,250 个新锁时便会触发锁升级。

  • 相关阅读:
    从1.5k到18k, 一个程序员的5年成长之路
    我是如何准备技术面试的
    10个惊艳的Ruby单行代码
    经典Spring面试题和答案
    数据分析应该要避免的6个错误
    代码重构的实战经验和那些坑
    勾勒物联网与大数据的数据中心路线图
    共筑Spark大数据引擎的七大工具
    es6学习总结(一)
    vue-cli搭建与vue-router(路由配置)
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3524114.html
Copyright © 2011-2022 走看看