SQL Server2008 事务和锁详解
- 格式:docx
- 大小:235.23 KB
- 文档页数:25
本文章简单的介绍了关于SQL Server,事务和锁的常见问题与用法同时为初学者提供好的参考意见,有需要的可以参考一下。
最近在项目中进行压力测试遇到了数据库的死锁问题,简言之,如下的代码在SERIALIZABLE 隔离级别造成了死锁:SELECT @findCount=COUNT(id)FROM MyTableWHERE[fk_related_id]=@ArgumentIF(@findCount>0)BEGINROLLBACK TRANSACTIONRETURN ERROR_CODEENDINSERT INTO MyTable([fk_related_id],…)VALUES(@Argument,…)COMMIT TRANSACTIONRETURN SUCCESS_CODE在搞清楚这个问题的过程中做了不少的实验,与各位共享。
这一篇是开篇,主要说明的是SQL Server 的四种(其实还有别的)经典的事务隔离级别,以及在不同的隔离级别下锁的使用手段,以及所带来的不同的数据一致性。
SQL Server 中锁的种类(Schema操作就暂时不涉及了)各个事务隔离级别下锁的使用SQL Server 中有四种事务隔离级别,具体的大家去参建MSDN。
下面列出在不同的事务隔离级别下这些锁是如何使用的:我们可以利用这些知识形象说明各个隔离级别下的数据一致性:Read Uncommitted 级别(1)脏读(2)更新丢失(3)不可重复读(4)幻读Read Committed 级别(1)脏读(2)更新丢失(3)不可重复读(4)幻读Repeatable Read 级别(1)脏读(2)更新丢失(3)不可重复读(4)幻读Serializable 级别(1)脏读(2)更新丢失(3)不可重复读(4)幻读我们从上图可以比较直观的看到以下的结论。
SQLServer2008中SQL应用之-“锁定(locking)”-邀月工作室-博客园SQL Server 2008中SQL应用之-“锁定(locking)”SQL Server 2008中SQL应用系列--目录索引一、锁的基本概念:锁定(Locking)是一个关系型数据库系统的常规和必要的一部分,它防止对相同数据作并发更新或在更新过程中查看数据,从而保证被更新数据的完整性。
它也能防止用户读取正在被修改的数据。
Sql Server动态地管理锁定,然而,还是很有必要了解Transact- SQL查询如何影响SQL Server中的锁定。
在此,简单介绍下锁的基本常识。
锁定有助于防止并发问题的发生。
当一个用户试图读取另一个用户正在修改的数据,或者修改另一个用户正在读取的数据时,或者尝试修改另一个事务正在尝试修改的数据时,就会出现并发问题。
SQL Server资源会被锁定,资源的锁定方式称作它的锁定模式(lock mode),下表列出SQL Server处理的主要锁定模式:可以锁定SQL Server中的各种对象,既可以是一个行,也可以是一个表或数据库。
可以锁定的资源在粒度(granularity)上差异很大。
从细(行)到粗(数据库)。
细粒度锁允许更大的数据库并发,因为用户能对某些未锁定的行执行查询。
然而,每个由SQL Server产生的锁都需要内存,所以数以千计独立的行级别的锁也会影响SQL Server 的性能。
粗粒度的锁降低了并发性,但消耗的资源也较少。
下表介绍SQL Server可以锁定的资源:不是所有的锁都能彼此兼容。
例如,一个被排他锁锁定的资源不能被再加其他锁。
其他事务必须等待或超时,直到排他锁被释放。
被更新锁锁定的资源只能接受其他事务的共享锁。
被共享锁锁定的资源还能接受其他的共享锁或更新锁。
SQL Server自动分配和升级锁。
升级意味着细粒度的锁(行或页锁)被转化为粗粒度的表锁。
当单个T-SQL语句在单个表或索引上获取5000多个锁,或者SQL Server实例中的锁数量超过可用内存阈值时,SQL Server会尝试启动锁升级。
sqlserver 锁详解
SQL Server 锁是用于在多用户环境下保证数据库完整性和一致性的重要机制。
锁的主要目的是防止在并发操作过程中出现数据不一致的问题,如丢失更新、脏读、不可重复读和幻觉读等。
SQL Server 锁机制主要强调由系统自动管理锁,以平衡锁定条件和系统性能。
锁可以分为以下三种类型:
1. 共享锁(Shared Lock):共享锁用于不更改或不更新数据的操作,如SELECT 语句。
在此锁模式下,其他事务可以继续读取同一数据,但不能修改。
共享锁适用于只读操作,确保数据在一段时间内的一致性。
2. 更新锁(Update Lock):更新锁用于可更新的资源中。
它防止在多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
更新锁用于保护更新操作,确保数据在更新过程中的一致性。
3. 独占锁(Exclusive Lock):独占锁用于数据修改操作,例如INSERT、UPDATE 或DELETE。
独占锁确保在锁定的时间内,其他事务无法对数据进行修改。
这种锁在整个事务期间保持锁定,直到事务结束。
SQL Server 锁机制在运行期间会自动进行优化处理,实行动态加锁。
对于一般的用户而言,通过系统的自动锁定管理机制基本可以满足使用要求。
但如果对数据安全、数据库完整性和一致性有特殊要求,就需要了解SQL Server 的锁机制,掌握数据库锁定方法。
在实际应用中,了解SQL Server 锁机制有助于更好地设计和优化应用程序,以避免因为锁冲突导致的性能问题。
同时,合理使用锁机制可以有效提高数据库并发性能,确保数据的一致性和完整性。
透明数据加密(TDE)是在Microsoft SQL Server 2008中推出的一个新的加密功能。
它旨在为整个数据库提供静态保护而不影响现有的应用程序。
对数据库进行加密,传统上都会涉及复杂的应用程序改动,例如修改表schemas、删除函数和明显的性能下降。
举例来说,要在Microsoft SQL Server 2005中使用加密,字段数据类型必须改为varbinary;不允许进行范围和相等搜索;并且应用程序必须调用内置函数(或自动使用这些内置函数的存储过程或视图)来处理加密和解密,这些都会降低查询性能。
这些问题不是只存在于SQL Server 的;其它数据库管理系统也受到相似的限制。
定制schemes经常用来解决根本不能使用的相等搜索和范围搜索。
即使是像创建一个索引或使用外键等的基本数据库元素也通常不能与单元级或字段级加密schemes一起使用,因为这些特性的使用会泄漏信息。
TDE简单地加密了所有东西,从而解决了这些问题。
因此,所有的数据类型、键、索引,等等这些可以完全使用而不必牺牲安全或泄漏磁盘上的信息。
而单元级加密不能提供这些功能、两个Windows 特性:文件加密系统(EFS)和BitLocker™ D rive Encryption,它通常用于和TDE同样的原因——它们提供相同范围的保护并对于用户来说是透明的。
2、Microsoft SQL Server加密Microsoft SQL Server提供两个级别的加密:数据库级别和单元级别。
两个都使用密钥管理层次结构。
2.1、密码密钥层次结构在加密树的根部是Windows Data Protection API(DPAPI ),它在机器级别保护密钥层次,并用来保护数据库服务器实例的服务主键(SMK)。
SMK保护数据库主键(DMK),它存储在用户数据库级别并反过来保护证书和非对称密钥。
这些反过来保护对称密钥,对称密钥保护数据。
TDE使用相似的层级到证书。
sqlserver锁机制
SQLServer锁机制是指SQLServer在处理并发操作时使用的一种机制,主要作用是确保数据的一致性和完整性。
SQL Server锁分为共享锁和排他锁,共享锁允许多个用户同时访问同一资源,而排他锁则只允许一个用户访问。
SQL Server锁机制可以通过以下几种方式实现:
1. 行级锁:行级锁允许在一个事务中对某一行数据进行加锁和解锁,其他事务不能访问该行数据。
2. 表级锁:表级锁允许在一个事务中对整个表进行加锁和解锁,其他事务不能访问该表数据。
3. 页面锁:页面锁允许在一个事务中对某一页数据进行加锁和解锁,其他事务不能访问该页数据。
4. 元数据锁:元数据锁用于保护SQL Server的系统表和系统存储过程,防止其他用户对其进行修改。
SQL Server锁机制的实现需要考虑并发性和性能的平衡。
如果加锁过于频繁,会导致性能下降;如果加锁不足,会导致数据的不一致性和完整性问题。
因此,SQL Server锁机制的实现需要根据具体的应用场景和业务需求进行调整和优化。
- 1 -。
数据库的事务和锁机制(SQLServer)说到事务,首先我们就要知道为什么需要事务,这就要先看看锁机制的相关概念!锁的概述一. 为什么要引入锁多个用户同时对数据库的并发操作时会带来以下数据不一致的问题:丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破坏了另一个修改的结果,比如订票系统脏读A用户修改了数据,随后B用户又读出该数据,但A用户因为某些原因取消了对数据的修改,数据恢复原值,此时B得到的数据就与数据库内的数据产生了不一致不可重复读A用户读取数据,随后B用户读出该数据并修改,此时A用户再读取数据时发现前后两次的值不一致幻像读A用户读取数据,随后B用户插入/删除了几条数据,此时A用户再读取数据时发现数据条数不一致并发控制的主要方法是封锁,锁就是在一段时间内禁止用户做某些操作以避免产生数据不一致二锁的分类锁的类别有两种分法:1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁MS-SQL Server 使用以下资源锁模式。
锁模式描述共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
更新 (U) 用于可更新的资源中。
防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。
确保不会同时同一资源进行多重更新。
意向锁用于建立锁的层次结构。
意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
架构锁在执行依赖于表架构的操作时使用。
架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。
共享锁共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。
资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。
一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。
SQL Server2008 事务和锁详解(MSSQL个人笔记之数据库优化之路五)1.SQL Server2008 事务和锁详解(MSSQL个人笔记之数据库优化之路五)2.3./********************************************************************************4. *主题:SQL Server2008 事务和锁详解5. *说明:本文是个人学习的一些笔记和个人愚见6. * 有很多地方你可能觉得有异议,欢迎一起讨论7. *文章出处:/szstephenzhou/article/details/78144338. * 博客地址:/szstephenzhou9. *作者:Stephenzhou(阿蒙)10. *日期: 2012.07.3111. *Mail:szstephenzhou@12. *另外:转载请著名出处。
13.**********************************************************************************/今天主要讲下锁,但是说到锁肯定就是要说到事务。
说到事务就要说下它的三个特性:自动性,一致性,独立性,持久性。
事务的分类:自动提交事务,显式事务,隐式事务,批处理级事务。
在这里不做过多的介绍和说明,如有疑问可以留言。
[sql]view plaincopyprint?1. --事务个数的查询2. select @@TRANCOUNT3.4. /*5.-----------6.07.8.(1 行受影响)*/9.10.--save transaction 设置保存点11.12.13.e Erp_System16.begin transaction InsertTransl17.save transaction A18.delete consume_Shopid_Range where19. id='10010xxxxxxx1'20.and Shopid=221.and GoodsId=622.and Amount =89423.and ConsumeDate='2012-07-26 11:55:40.153'24.and mark='2FA4E2F3-DD8B-4ED3-8D9C-D7AE33BA5D0D'25. rollback transaction A26. insert into consume_Shopid_Range27. (id,Shopid,GoodsId,Amount,ConsumeDate,mark)values28. ('10010xxxxxxx2',3,1,321,'2012-07-31 11:55:40.153','szstephenzhou')29. commit transaction InsertTransl30. go31.32./*(0 行受影响)33.34.(1 行受影响)*/35.--分析下上个结果:36.--在上面的一个事务中,所限开始了一个事务 InsertTransl37.--在这个事务中设置了保存的A38.--然后删除一条记录39.--回顾到A点也就是没有删除40.--新增了一条记录41.--commit提交事务InsertTransl42.43.44.45.46.---Set xact_abort 语句47./*48. *格式如下:49. *SET XACT_ABORT {ON|OFF}50. *当设置为 setxact_abort on 时,如果SQL语句出现运行错误,则数据库引擎将终止并回滚整个事务,51.即使前面能够正确的执行的SQL。
52. *当设置成set xact_abort off 如果SQL错误的时候,数据库只回滚产生错误的sql语句。
并且事务继续53.默认的情况是ON55.if OBJECT_ID('tb') is not null56.drop table tb57.go58.create table tb(id int identity primary key ,name varchar(10))59.60.61. set xact_abort on62. begin transaction insetran63. insert into tb values('stephen');64. insert into tb values('mrzhou');65. insert into tb values('stephen----------');66. insert into tb values('刘德华');67. insert into tb values('张学友');68. commit transaction insetran69. go70. /*71.消息 208,级别 16,状态 1,第 3 行72.对象名 'tb' 无效。
73.74. */75. select * from tb76. /*77. id name78.----------- ----------79.80.(0 行受影响)81.82. */83. set xact_abort off84. begin transaction insetran85. insert into tb values('stephen');86. insert into tb values('mrzhou');87. insert into tb values('stephen----------');88. insert into tb values('刘德华');89. insert into tb values('张学友');90. commit transaction insetran91. go92. /*93.(1 行受影响)94.95.(1 行受影响)96.消息 8152,级别 16,状态 14,第 4 行97.将截断字符串或二进制数据。
98.语句已终止。
99.100.(1 行受影响)101.102.(1 行受影响)103.*/104.105.s elect * from tb106./*id name107.----------- ----------108.1 stephen109.2 mrzhou110.4刘德华111.5张学友112.113.(4 行受影响)114.*/115.116.--如上所述当set xact_abort on 如果出现错误就会全部回滚而设置成off的时候就只跳过错误继续执行。
117.118.--但是如果设置成off的时候也是没办法执行跳过。
这是为什么呢??119.120.set xact_abort off121.begin transaction insetran122.insert into tb values('stephen');123.insert into tb values('mrzhou');124.insert into tb values(1,'stephen');125.insert into tb values('刘德华');126.insert into tb values('张学友');mit transaction insetran128.go129.130./*131.消息 8101,级别 16,状态 1,第 5 行132.仅当使用了列列表并且 IDENTITY_INSERT 为 ON 时,才能为表'tb'中的标识列指定显式值。
133.*/134.--因为在这里是属于编译错误,在identity属性中不能插入数字。
135.136.137.138.139.140.141.--在事务中有些语句是不能用的如下142./*143. *CREATE DATABASE144. *ALTER DATABASE145. *DROP DATABASE146. *RECONFIGURE147. *BACKUP148. *RESTORE149. *UPDATE STATISTICS150.151.*/锁机制什么是锁,锁到底是个什么东西?有很多人都感觉是懂非懂的样子,了解了,好像是个什么东西。
其实很简单什么到底是什么呢?锁是一种规则。
是用来控制同步数据访问控制的一种机制。
打个比方吧,数据库中的锁就像交通信号灯。
而车子就是每个事务。
如果没有好好的控制红绿灯的话就会怎么样,当然是堵车了。
如果没有控制好锁同样会堵塞。
锁的定制大家都知道,数据库的资源只由一个用户使用只要程序没问题,数据就不会出现不一致的情况。
如果两个或者多个用户同时修改就有可能出现并发冲突导致如下错误:更新丢失更新丢失是指两个用户同时更新一个数据库对象,其中一个用户更新覆盖了之前那个用户的更新从而导致错误不可重复读一个用户在一个事务中读取的数据前后不一致,其中可能是有别的用户做了修改幻读一个用户读取一个结果集后,其他用户对该结果集进行了插入或者删除,当第一个用户再读这个结果集的时候发现数据多了或者少了。
为了解决这些问题,SQLserver 数据库引入了锁。
1》从数据库系统的角度分为共享锁S 排它锁X(独占锁)更新锁U 意向锁架构锁和大容量更新锁等共享锁S:并发执行对一个数据资源读取操作时,任何其他事务不能修改该资源的数据;读取操作完成后S锁释放。
排它锁X:在执行INSERT ,UPDATE,DELETE时,确保不会同时对同一资源进行多重更新操作。
修改数据之前,需要执行读取操作获取数据此时需要申请共享锁S,然后再申请排它锁X更新锁U:为了避免死锁的情况而使用的锁模式两个事务对一个数据资源先读取再更新的操作,使用了S锁和X锁进行操作。
X锁一次只有一个X锁在对象上的,也就是说一次只有一个事务可以获取资源的更新锁。
如果需要对数据进行修改操作,则需要把更新锁转换为U锁,否则将锁转换成S 锁意向锁I:需要在层次结构中的某些底层资源上获取S锁或者X锁或者U锁。
意向锁可以提高性能,因为数据库引擎不需要检查表中的每行或每页上的S锁就确定是否可以获取到该表上的X锁。
架构锁:为了防止修改表结构时对表进行的并发访问锁。