[转]浅谈MS-SQL锁机制
本文转自:http://study.99net.net/study/database/mssql/1085625420.html
浅谈MS-SQL锁机制 |
|
---|---|
|
|
2004-05-27 | |
锁的概述
一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新 脏读 不可重复读 并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致 二 锁的分类 锁的类别有两种分法: 1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁 MS-SQL Server 使用以下资源锁模式。 锁模式 描述 共享锁 更新锁 若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。 排它锁 意向锁 意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。 锁模式 描述 独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。 2. 从程序员的角度看:分为乐观锁和悲观锁。 MS-SQLSERVER 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制 三 锁的粒度 SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁 资源 描述 四 锁定时间的长短 锁保持的时间长度为保护所请求级别上的资源所需的时间长度。 用于保护读取操作的共享锁的保持时间取决于事务隔离级别。采用 READ COMMITTED 的默认事务隔离级别时,只在读取页的期间内控制共享锁。在扫描中,直到在扫描内的下一页上获取锁时才释放锁。如果指定 HOLDLOCK 提示或者将事务隔离级别设置为 REPEATABLE READ 或 SERIALIZABLE,则直到事务结束才释放锁。 根据为游标设置的并发选项,游标可以获取共享模式的滚动锁以保护提取。当需要滚动锁时,直到下一次提取或关闭游标(以先发生者为准)时才释放滚动锁。但是,如果指定 HOLDLOCK,则直到事务结束才释放滚动锁。 用于保护更新的排它锁将直到事务结束才释放。 将冲突锁释放而且连接获取了所请求的锁。 连接的超时间隔已到期。默认情况下没有超时间隔,但是一些应用程序设置超时间隔以防止无限期等待 五 SQL Server 中锁的自定义 1 处理死锁和设置死锁优先级 死锁就是多个用户申请不同封锁,由于申请者均拥有一部分封锁权而又等待其他用户拥有的部分封锁而引起的无休止的等待 可以使用SET DEADLOCK_PRIORITY控制在发生死锁情况时会话的反应方式。如果两个进程都锁定数据,并且直到其它进程释放自己的锁时,每个进程才能释放自己的锁,即发生死锁情况。 2 处理超时和设置锁超时持续时间。 @@LOCK_TIMEOUT 返回当前会话的当前锁超时设置,单位为毫秒 SET LOCK_TIMEOUT 设置允许应用程序设置语句等待阻塞资源的最长时间。当语句等待的时间大于 LOCK_TIMEOUT 设置时,系统将自动取消阻塞的语句,并给应用程序返回"已超过了锁请求超时时段"的 1222 号错误信息 示例 3) 设置事务隔离级别。 4 ) 对 SELECT、INSERT、UPDATE 和 DELETE 语句使用表级锁定提示。 5) 配置索引的锁定粒度 六 查看锁的信息 1 执行 EXEC SP_LOCK 报告有关锁的信息 七 使用注意事项 如何避免死锁 解决问题 如何对行 表 数据库加锁 八 几个有关锁的问题 1 如何锁一个表的某一行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED SELECT * FROM table ROWLOCK WHERE id = 1 2 锁定数据库的一个表 SELECT * FROM table WITH (HOLDLOCK) 加锁语句: 几个例子帮助大家加深印象 1)排它锁 若同时执行上述两个语句,则select查询必须等待update执行完毕才能执行即要等待30秒 2)共享锁 在第二个连接中执行以下语句 若同时执行上述两个语句,则第二个连接中的select查询可以执行 3)死锁 在第二个连接中执行以下语句 同时执行,系统会检测出死锁,并中止进程 补充一点: HOLDLOCK 持有共享锁,直到整个事务完成,应该在被锁对象不需要时立即释放,等于SERIALIZABLE事务隔离级别 NOLOCK 语句执行时不发出共享锁,允许脏读 ,等于 READ UNCOMMITTED事务隔离级别 PAGLOCK 在使用一个表锁的地方用多个页锁 READPAST 让sql server跳过任何锁定行,执行事务,适用于READ UNCOMMITTED事务隔离级别只跳过RID锁,不跳过页,区域和表锁 ROWLOCK 强制使用行锁 TABLOCKX 强制使用独占表级锁,这个锁在事务期间阻止任何其他事务使用这个表 UPLOCK 强制在读表时使用更新而不用共享锁 应用程序锁: 处理应用程序锁的两个过程 sp_getapplock 锁定应用程序资源 sp_releaseapplock 为应用程序资源解锁 注意: 锁定数据库的一个表的区别 SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表,但不能更新删除 SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 |
转载于:https://www.cnblogs.com/lindj0307/archive/2009/05/13/1455782.html
[转]浅谈MS-SQL锁机制相关推荐
- 只是浅谈MS SQL Server的Page Splits运作原理
一直以来,很多文章或书籍都会提到数据库在对数据做增删修都会因为数据异动导致Page Splits的产生. 一旦过度的分割就会提高所谓的逻辑片段,而要降低逻辑片段就得对数据表或索引做Rebuild或Re ...
- 并发执行变成串行_大神浅谈数据库并发控制 锁和 MVCC
在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制.  如果数据库中的所有事务 ...
- 浅谈数据库并发控制 - 锁和 MVCC
文章写得不错,原文地址见 http://draveness.me/database-concurrency-control.html 在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案, ...
- 浅谈ASP.NET内部机制(五)
浅谈ASP.NET内部机制(五) 前言:本章要谈页面生命周期了,过程挺多的,但是一点都不难.不信可以看看.我尽量的讲的平实一些,而且理解页面的生命周期对喜欢开发自定义控件和组件的朋友是很有帮助的. 系 ...
- 浅谈 LiveData 的通知机制
LiveData 和 ViewModel 是 Google 官方的 MVVM 架构的一个组成部分.巧了,昨天分析了一个问题是 ViewModel 的生命周期导致的.今天又遇到了一个问题是 LiveDa ...
- 浅谈实现SQL Server远距离异地容灾
浅谈实现SQL Server远距离异地容灾 SQL Server 从2012 推出 SQL Alwayson 以来,使我们对SQL Server数据库容灾产生翻天覆地的变化. 其优点很明显 1.不依赖 ...
- ajax机制 缓存,浅谈Ajax的缓存机制
浅谈Ajax的缓存机制 Ajax的缓存机制和浏览器处理资源时的缓存机制是一样的. 三条简单规则: 只要是URL相同的GET请求,浏览器会使用缓存(当然还要看服务器的Cache-Control/Expi ...
- 浅谈 AnalyticDB SQL 优化
浅谈 AnalyticDB SQL 优化 前言 ADB计算引擎 ADB优化器 ADB索引 ADB SQL开发与表分区设计 ADB SQL开发的性能指南 ADB慢SQL的定位和常见原因 ADB慢SQL优 ...
- 浅谈数据库乐观锁、悲观锁
来自:非科班的科班 并发问题 当程序中出现并发的问题时,我们就要有相应的手段保证数据的正确性,防止多个用户在操作数据的时候,出现和预期数据不一样的现象,产生脏数据,在数据库的层面如果没有做好并发控制, ...
- js 单页面ajax缓存策略,浅谈ajax的缓存机制---IE浏览器方面
这篇文章主要介绍了IE浏览器关于ajax的缓存机制,文中给大家提到了Ajax解决浏览器的缓存问题,解决方法有很多种.有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助. IE浏览器对于同一 ...
最新文章
- MyBatis整合第三方缓存
- sql server 补齐0学习总结
- 用8小时工作,用24小时思考
- 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧
- instrumentation模拟很多activity的操作
- 0020-使用JDBC向Kudu表插入中文字符-双引号的秘密
- nodejs安装不好_nodejs安装过程中环境变量配置的问题
- 9.template -- basic concepts
- 在utf8和gb2312中 不同编码情况下,汉字 数字 英文占的字节数?
- web前端-HTML 媒体插件 022
- win10系统与时间服务器同步超时,Win10时间同步出错怎么办 Win10时间同步出错解决方法...
- 美团四面 Java 岗,终获 offer,我是这么回答面试官的
- 重学Elasticsearch第1章 : Elasticsearch, Kibana概念、Elasticsearch相关术语
- CSS3 渐变边框,按钮样式、设计图标、电子优惠券 详解!
- PTA-莫尔斯码(字符串,模拟)
- 首师大附中科创教育平台 我的刷题记录 0313 50111117海岛帝国:诞辰之日
- vue项目在ie9中碰到的问题——axios请求拒绝访问
- submit()和execute()区别
- L2TP的windows客户端连接
- Android apk签名方法介绍
热门文章
- linux自动挂载usb打印机,Linux下使用Usbmount实现USB设备自动挂载
- python常见的数值运算符_第18 p,Python中各种常用的运算符,特别是增量运算符...
- HTML+CSS+JS实现 ❤️基于Javascript简单计算器特效❤️
- 《零基础》MySQL 删除数据库(六)
- mysql linux改密码忘记了怎么办_linux上mysql改密码忘了怎么办?
- android studio列模式,在Android studio 中使用单例模式
- php 解析yaml,php yaml 解析 报错问题
- android webview 字体 系统字体大小,Android 系统字体大小动态改变,导致webview中显示不兼容的问题解决...
- 如何安装mysql5.7.2_CentOS 7.2 安装MySQL 5.7
- mysql连接不上远程数据库_Mysql 连接不上远程数据库,求助