资源预览内容
第1页 / 共29页
第2页 / 共29页
第3页 / 共29页
第4页 / 共29页
第5页 / 共29页
第6页 / 共29页
第7页 / 共29页
第8页 / 共29页
第9页 / 共29页
第10页 / 共29页
亲,该文档总共29页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第第9 9章章 事事 务务 与与 锁锁事事 务务9.1锁锁9.29.1 9.1 事事 务务9.1.1 事务的概念事务的概念 事务是并发控制的基本单位。所谓事事务是并发控制的基本单位。所谓事务,就是一个操作序列,这些操作要么都务,就是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割执行,要么都不执行,它是一个不可分割的工作单位。的工作单位。 如果某一事务成功,则在该事务中进如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库行的所有数据修改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据修改均被清必须取消或回滚,则所有数据修改均被清除。除。 SQL Server以下列事务模式运行。以下列事务模式运行。(1)自动提交事务)自动提交事务 每条单独的语句都是一个事务。每条单独的语句都是一个事务。(2)显式事务)显式事务 每个事务均以每个事务均以BEGIN TRANSACTION语句显式开始,以语句显式开始,以COMMIT或或ROLLBACK语句显式结束。语句显式结束。(3)隐式事务)隐式事务 在前一个事务完成时新事务隐式启动,在前一个事务完成时新事务隐式启动,但每个事务仍以但每个事务仍以COMMIT或或ROLLBACK语语句显式完成。句显式完成。(4)批处理级事务)批处理级事务 只能应用于多个活动结果集(只能应用于多个活动结果集(MARS),),在在MARS会话中启动的会话中启动的Transact-SQL显式或显式或隐式事务变为批处理级事务。隐式事务变为批处理级事务。 9.1.2 事务的特性事务的特性原子性原子性一致性一致性隔离性隔离性持久性持久性9.1.3 事务控制语句事务控制语句 所有的所有的T-SQL语句都是内在的事务。语句都是内在的事务。SQL Server 2005还包括事务控制语句,将还包括事务控制语句,将SQL Server语句集合分组后形成单个的逻语句集合分组后形成单个的逻辑工作单元。辑工作单元。 1BEGIN TRANSACTION语句语句 BEGIN TRANSACTION语句标记一语句标记一个显式本地事务的起始点,即事务的开始。个显式本地事务的起始点,即事务的开始。 其语法格式为:其语法格式为:BEGIN TRAN | TRANSACTION transaction_name | tran_name_variable WITH MARK description 其中各参数的含义如下。其中各参数的含义如下。transaction_name是事务名。是事务名。 tran_name_variable是用户定义的、是用户定义的、含有有效事务名称的变量,该变量必须是含有有效事务名称的变量,该变量必须是字符数据类型。字符数据类型。 WITH MARK指定在日志中标记事务。指定在日志中标记事务。 description是描述该标记的字符串。是描述该标记的字符串。2COMMIT TRANSACTION语句语句 COMMIT TRANSACTION语句标志语句标志一个成功的隐式事务或显式事务的结束。一个成功的隐式事务或显式事务的结束。 其语法格式为:其语法格式为:COMMIT TRAN | TRANSACTION transaction_name | tran_name_variable 3ROLLBACK TRANSACTION语语句句 ROLLBACK TRANSACTION语句将语句将显式事务或隐性事务回滚到事务的起点或显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。其语法格式为:事务内的某个保存点。其语法格式为:ROLLBACK TRAN | TRANSACTION transaction_name | tran_name_variable | savepoint_name | savepoint_variable 其中,参数其中,参数transaction_name和和tran_name_variable的含义与的含义与BEGIN TRANSACTION语句中一样。语句中一样。 savepoint_name是是SAVE TRANSACTION语句中设置的保存点,当条件回滚只影响事务语句中设置的保存点,当条件回滚只影响事务的一部分时,可使用的一部分时,可使用savepoint_name。 savepoint_variable是用户定义的、是用户定义的、包含有效保存点名称的变量名。包含有效保存点名称的变量名。4SAVE TRANSACTION语句语句 SAVE TRANSACTION语句在事务内语句在事务内设置保存点。其语法格式为:设置保存点。其语法格式为:SAVE TRAN | TRANSACTION savepoint_name | savepoint_variable 其中,参数其中,参数savepoint_name和和savepoint_variable的含义与的含义与ROLLBACK TRANSACTION语句中的一语句中的一样。样。9.1.4 分布式事务分布式事务 当一个事务分散在多个服务器上时,当一个事务分散在多个服务器上时,它就是分布式事务。它就是分布式事务。 分布式事务跨越两个或多个称为资源分布式事务跨越两个或多个称为资源管理器的服务器,称为事务管理器的服务管理器的服务器,称为事务管理器的服务器组件必须在资源管理器之间协调事务管器组件必须在资源管理器之间协调事务管理。理。9.2 9.2 锁锁9.2.1 锁的概念锁的概念 锁定是锁定是Microsoft SQL Server Database Engine用来同步多个用户同时对用来同步多个用户同时对同一个数据块的访问的一种机制。同一个数据块的访问的一种机制。 通过锁机制,可以防止脏读、不可重通过锁机制,可以防止脏读、不可重复读和幻觉读。复读和幻觉读。9.2.2 锁的类型锁的类型 Microsoft SQL Server Database Engine使用不同的锁模式锁定资源,这些使用不同的锁模式锁定资源,这些锁模式确定了并发事务访问资源的方式。锁模式确定了并发事务访问资源的方式。(1)共享锁)共享锁 共享锁也称为共享锁也称为S锁,允许并行事务读取锁,允许并行事务读取同一种资源,这时的事务不能修改访问的同一种资源,这时的事务不能修改访问的数据。当使用共享锁锁定资源时,不允许数据。当使用共享锁锁定资源时,不允许修改数据的事务访问数据。修改数据的事务访问数据。 (2)排他锁)排他锁 排他锁也称为排他锁也称为X锁,它可以防止并发锁,它可以防止并发事务对资源进行访问。事务对资源进行访问。(3)更新锁)更新锁 更新锁也称为更新锁也称为U锁,它可以防止常见锁,它可以防止常见的死锁。更新锁用来预定要对资源施加的死锁。更新锁用来预定要对资源施加锁,它允许其他事务读,但不允许再施加锁,它允许其他事务读,但不允许再施加锁或锁。锁或锁。 (4)意向锁)意向锁 数据库引擎使用意向锁来保护共享锁数据库引擎使用意向锁来保护共享锁(S锁)或排他锁(锁)或排他锁(X锁),放置在锁层次锁),放置在锁层次结构的底层资源上。结构的底层资源上。 (5)架构锁)架构锁 执行表的数据定义语言(执行表的数据定义语言(DDL)操作)操作(例如添加列或删除列)时使用架构修改(例如添加列或删除列)时使用架构修改锁(锁(Sch-M锁)。在架构修改锁(锁)。在架构修改锁(Sch-M锁)锁)起作用的期间,会防止对表的并发访问。起作用的期间,会防止对表的并发访问。 (6)大容量更新锁)大容量更新锁 当将数据大容量复制到表,且指定了当将数据大容量复制到表,且指定了TABLOCK提示或者使用提示或者使用sp_tableoption设设置了置了table lock on bulk表选项时,将使用大表选项时,将使用大容量更新锁(容量更新锁(BU锁)。锁)。 (7)键范围锁)键范围锁 在使用可序列化事务隔离级别时,对在使用可序列化事务隔离级别时,对于于Transact-SQL语句读取的记录集,键范语句读取的记录集,键范围锁可以隐式保护该记录集中包含的行范围锁可以隐式保护该记录集中包含的行范围。围。 9.2.3 锁的使用锁的使用 Microsoft SQL Server Database Engine具有多粒度锁定,允许一个事务锁具有多粒度锁定,允许一个事务锁定不同类型的资源。为了尽量减少锁定的定不同类型的资源。为了尽量减少锁定的开销,数据库引擎自动将资源锁定在适合开销,数据库引擎自动将资源锁定在适合任务的级别。锁定在较小的粒度(例如行)任务的级别。锁定在较小的粒度(例如行)可以提高并发度,但开销较高,因为如果可以提高并发度,但开销较高,因为如果锁定了许多行,则需要持有更多的锁。锁定了许多行,则需要持有更多的锁。 锁定在较大的粒度(例如表)可以降锁定在较大的粒度(例如表)可以降低并发度,因为锁定整个表限制了其他事低并发度,因为锁定整个表限制了其他事务对表中任意部分的访问,但其开销较低,务对表中任意部分的访问,但其开销较低,因为需要维护的锁较少。因为需要维护的锁较少。9.2.4 死锁死锁 在两个或多个任务中,如果每个任务在两个或多个任务中,如果每个任务锁定了其他任务试图锁定的资源,此时会锁定了其他任务试图锁定的资源,此时会造成这些任务永久阻塞,从而出现死锁。造成这些任务永久阻塞,从而出现死锁。 除非某个外部进程断开死锁,否则死除非某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。锁中的两个事务都将无限期等待下去。 Microsoft SQL Server Database Engine死锁监视器定期检查陷入死锁的任死锁监视器定期检查陷入死锁的任务。如果监视器检测到循环依赖关系,将务。如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品,然后终止选择其中一个任务作为牺牲品,然后终止其事务并提示错误。其事务并提示错误。 尽管死锁不能完全避免,但遵守以下尽管死锁不能完全避免,但遵守以下特定的编码惯例可以将发生死锁的机会降特定的编码惯例可以将发生死锁的机会降至最低。至最低。(1)按同一顺序访问对象)按同一顺序访问对象(2)避免事务中的用户交互)避免事务中的用户交互(3)保持事务简短并处于一个批处)保持事务简短并处于一个批处理中理中(4)使用较低的隔离级别)使用较低的隔离级别(5)使用基于行版本控制的隔离级)使用基于行版本控制的隔离级别别(6)使用绑定连接)使用绑定连接
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号