• 1. 概述
  • 2. SQL Server 锁机制
  • 3. 锁模式
  • 4. 锁的粒度
  • 4. 查看锁
  • 5. 死锁

1. 概述

SQL Server 数据库支持多个用户同时访问数据库,但当用户同时访问数据库时,就会造成并发问题,锁的机制能很好地解决这个问题,保证数据的完整性和一致性;
SQL Server 自带锁机制,若是简单的数据库访问机制,完全能满足用户的需求;但对于数据完全与数据完整性有特殊要求,就必须自动控制锁机制解决;

2. SQL Server 锁机制

锁是处理 SQL Server 中并发问题的最有效手段,当多个事务访问同一数据时,能很好地保证数据的完整性和一致性;
在很多数据库系统中(如DB2、MySQL、Oracle)都有锁机制,其规则也大同小异;
在 SQL Server 中采用系统来管理锁,SQL Server 中采用的是动态加锁的机制;
SQL Server 中有一套默认的锁机制,若用户在使用数据库的过程中不设置任何锁,系统将自动对锁管理;

3. 锁模式

在 SQL Server 中有不同的锁,在各种锁的类型中有些是能相互兼容的,锁的类型决定了并发发生时数据资源的范文模式,在 SQL Server 中常用的锁以下 5 种;

  1. 更新锁:一般使用于可更新数据,能防止并发访问中的脏读情况以及在数据更新时可能会出现的死锁情况,更新锁一般会在对数据进行查询更新时使用;若事务修改资源,更新锁会转换为排他锁,否则会转换为共享锁;在 SQL Server 中,当一个事务访问资源时获得更新锁,其他事务能够对资源进行访问,但不允许排他式访问;
  2. 排他锁:在事务对资源进行数据更改操作(如 INSERT、UPDATE、DELETE)时使用;排他锁能保证同一数据不会被多个事务同时进行更改操作;
  3. 共享锁:共享锁允许多个事务同时访问同一资源,但不允许其他事务修改当前事务所使用的数据;
  4. 键范围锁:能防止幻读,通过保护行之间键的范围还能防止对事务访问的记录集进行幻读插入或删除;
  5. 架构锁:数据库引擎在表数据定义语言(DDL)操作(如添加列或删除表)的过程中使用架构修改锁;保持该锁期间,架构锁将阻止对表进行并发访问;即架构锁在释放前将阻止所有外围操作;

4. 锁的粒度

Microsoft SQL Server 数据库引擎具有多粒度锁定,允许一个事务锁定不同类型的资源;
为了减少锁定的开销,数据库引擎自动将资源锁定在适合任务的级别;锁定在较小的粒度(如行)能提高并发度,但开销较高,因为若锁定了许多行,就需要持有更多的锁;
锁定在加大的粒度(如表)会降低并发,因为锁定整个表限制了其他事务对表中任意部分的访问;但其开销较低,因为需要维护的锁较少;

数据库引擎通常必须获取多粒度级别上才能完整地保护资源,多粒度级别上的所称为层次结构;

4. 查看锁

在 SQL Server数据库中,能通过查看 sys.dm_tran_locks 返回 SQL Server 数据库中有关当前活动的锁的管理的信息;
向锁管理器发出的已授予锁或正等待授予锁的每个当前活动请求分别对应一行;结果集中的列大体分为两组:资源组和请求组;

5. 死锁

在两个或多个任务中,若每一个任务都锁定了其他的资源,就会造成永久的阻塞,这种情况就是死锁;

形成死锁有以下 4 个必要条件:

  • 互斥条件:资源不能被共享,只能被一个进程施使用;
  • 请求与保持条件:已获得资源的进程能同时申请其他资源;
  • 非剥夺条件:已分配的资源不能从该进程中被剥夺;
  • 循环等待条件:多个进程构成环路,且每个进程都在等待相邻进程正在使用的资源;

在一个复杂的数据库系统中很难百分之百地避免死锁,但能按照以下的访问策略减少死锁的发生;

  1. 所有事务中以相同的次序使用资源;避免出现循环;
  2. 减少事务持有资源的时间,避免事务中的用户交互;
  3. 让事务保持在一个批处理中;
  4. 由于锁的隔离级别越高共享锁的时间就越长,因此能降低隔离级别来达到减少竞争的目的;
  5. 使用绑定连接;

注意: SQL Server 数据库引擎自动检测 SQL Server 中的死锁循环;数据库引擎选择一个会话作为死锁的牺牲品,然后终止当前事务(出现错误)来打断死锁;

SQLServer 数据库之锁相关推荐

  1. SqlServer数据库同步方案详解

    SqlServer数据库同步是项目中常用到的环节,若一个项目中的数据同时存在于不同的数据库服务器中,而这些数据库需要被多个不同的网域调用时,配置SqlServer数据库同步是个比较好的解决方案.Sql ...

  2. (转)对SQLSERVER数据库事务日志的疑问

    本文转载自桦仔的博客http://www.cnblogs.com/lyhabc/archive/2013/06/10/3130856.html 对SQLSERVER数据库事务日志的疑问 摸不透SQLS ...

  3. Sqlserver 事务与锁

    最近没怎么睡好  也可以能和最近换工作有关 断断续续的 理解里 事务与锁 为什么需要锁 因为数据库事务迸发的时候会影响数据的完整与准确性 所以 数据库事务会有一个锁的概念 比如 A老师修改小明的数据  ...

  4. [转-记] 批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor2.1.11

    原文链接:批量解密SQLSERVER数据库中的各种对象的工具dbForge SQL Decryptor - 桦仔 - 博客园 ------------------------------------- ...

  5. 在SQLserver数据库里设置作业的步骤

    在SQLserver数据库里设置作业(对数据库的表定期进行数据清理)的步骤 1.首先,要打开sql server代理的服务,在我的电脑,右键管理的服务打开,SQL Server 代理 (MSSQLSE ...

  6. 获取SQLServer数据库中所有表

    对于获取SQLSERVER数据库中所有表,首先第一步引有SQLDMO.dll 找到文件路径: C:\Program   Files\Microsoft   SQL   Server\80\Tools\ ...

  7. nodejs操作sqlserver数据_pyspark操作MySQL、SQLServer数据库进行数据处理操作

    欢迎访问本人的CSDN博客[Together_CZ],我是沂水寒城. https://yishuihancheng.blog.csdn.net 在大数据处理领域里面,Hadoop和spark可以说是最 ...

  8. 浅谈数据库乐观锁、悲观锁

    来自:非科班的科班 并发问题 当程序中出现并发的问题时,我们就要有相应的手段保证数据的正确性,防止多个用户在操作数据的时候,出现和预期数据不一样的现象,产生脏数据,在数据库的层面如果没有做好并发控制, ...

  9. sqlserver在linux数据备份,SQLServer数据库之sqlserver for linux自动备份数据库脚本

    本文主要向大家介绍了SQLServer数据库之sqlserver for linux自动备份数据库脚本,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助. 不多说直接上脚本 # ...

  10. 简单的3个SQL视图搞定所有SqlServer数据库字典

    此文系转载,并非本人原创. 网上有很多SQL SERVER数据库字典的SQL语句,七零八落,我在工作整理了一下思路,总结SQL代码如下.数据库字典包括表结构(分2K和2005).索引和主键.外键.约束 ...

最新文章

  1. 【武书连】2021 中国一流大学名单(30 所)和中国大学综合实力 700 强出炉!
  2. 小程序在输入npm命令_微信小程序使用npm包步骤
  3. Android DrawLayout + ListView 的使用(一)
  4. 【Leetcode | easy】罗马数字转整数
  5. MyEclipse使用总结——在MyEclipse中设置jsp页面为默认utf-8编码
  6. php中对象的遍历输出,PHP中的对象遍历技巧
  7. ACCESS中不支持left join解决方案
  8. wechat server的配置
  9. Python之路(运算符)
  10. Insyde uefi 隐藏设置_文件隐藏工具Wise Folder Hider Pro便携版分享
  11. java 1.7 环境变量_安装JDK1.8之后又安装1.7出现的环境变量问题
  12. Pr人像视频后期处理磨皮美白插件工具素材【汉化】
  13. USB写保护的一些工具记录
  14. drcom for linux,Ubuntu Linux 6.10下用Dr.COM(drcom-client)接入网络的问题
  15. 主线程结束子线程会跟着结束吗
  16. AI智能生图技术的未来趋势
  17. 自动学习——《Learning to Teach》——ICLR2018
  18. shiro反序列化漏洞学习(工具+原理+复现)
  19. 联合概率,边际概率和条件概率
  20. 转载----孙振耀退休感言

热门文章

  1. JavaScript的注释
  2. 预训练模型MT-BERT的探索和应用
  3. 【python】实战:“唱啥”app后台开发
  4. 12月大学计算机二级考试时间,2020年12月计算机二级考试报名时间及考试安排
  5. ADF4351应用电路
  6. 数字0123456789对应的ASCII码值
  7. LSM303D磁力计数据读取实验
  8. Red Giant Trapcode Suite 16 for Mac(红巨星粒子插件)
  9. GD32f103介绍第一章
  10. 计算机科学之父--图灵