数据库系统应用与管理10_第1页
数据库系统应用与管理10_第2页
数据库系统应用与管理10_第3页
数据库系统应用与管理10_第4页
数据库系统应用与管理10_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、事务处理复习:触发器习题讲解事务处理基本概念事务处理基本操作课堂作业事务处理 事务概述事务概述1事务的概念事务的概念事物(Transaction)是SQL Server中的执行单元,它由一系列T-SQL语句组成。事务中的操作语句可作为一个不可分割的整体,要么执行,要么都不执行。2. 事务的特性事务的特性设计事务程序时应保证事物具有以下特性:(1)原子性(Automicity)(2)一致性(Consistency)(3)隔离性(Isolation)(4)持久性(Durability)3执行事务的模式执行事务的模式事务是以连接为单位,每个连接都可以有自己的事务。在同一个连接中,当事务开始时,所有后

2、续对数据进行操作的语句都可作为该事务的成员,直到事务结束为止。SQL Server提供了3种执行事务的模式。(1)自动提交事务(2)显式事务(3)隐性事务BEGIN TRANSACTION标记一个显式本地事务的起始点。BEGIN TRANSACTION将 TRANCOUNT 加 1。语法语法BEGIN TRAN SACTION transaction_name | tran_name_variable WITH MARK description transaction_name是给事务分配的名称。transaction_name 必须遵循标识符规则,但是不允许标识符多于 32 个字符。仅在嵌套

3、的 BEGIN.COMMIT 或 BEGIN.ROLLBACK 语句的最外语句对上使用事务名。tran_name_variable是用户定义的、含有有效事务名称的变量的名称。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。WITH MARK description指定在日志中标记事务。Description 是描述该标记的字符串。如果使用了 WITH MARK,则必须指定事务名。WITH MARK 允许将事务日志还原到命名标记。BEGIN TRANSACTION 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 BEGIN TRA

4、NSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。BEGIN TRANSACTION 为使用本语句的连接启动一个本地事务。根据当前事务隔离级别的设置情况,为支持该连接所发出的 Transact-SQL 语句而获取的许多资源被该事务锁定,直到此事务以 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成。长时间处于等待处理状态的事务会阻止其他用户访问

5、锁定的资源。虽然 BEGIN TRANSACTION 启动一个本地事务,但是在应用程序接下来执行了一个必须记录的操作(如执行 INSERT、UPDATE 或 DELETE 语句)之前,它并不被记录在事务日志中。应用程序能执行一些操作,例如为了保护 SELECT 语句的事务隔离级别而获取锁,但是直到应用程序执行一个修改操作日志中才有记录。在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记第一个(最外部的)事务名。回滚到其它任何名字(有效的保存点名除外)都会产生错误。事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这些语句仅当外层的事务回滚时才会进行回滚。BEG

6、IN TRANSACTION 启动一个本地事务。如果在事务提交或回滚之前执行了如下操作,本地事务将升级到分布式事务: 执行了一个 INSERT、DELETE 或 UPDATE 语句,该语句引用了连接的服务器上的一个远程表。如果用于访问连接服务器的 OLE DB 提供程序不支持 ItransactionJoin 接口,该 INSERT、UPDATE 或 DELETE 语句则会失败。当启用了 REMOTE_PROC_TRANSACTIONS 选项时,将调用远程存储过程。 SQL Server 的本地复本成为事务控制器并且使用 MS DTC 来管理该分布式事务。COMMIT TRANSACTION标

7、志一个成功的隐性事务或用户定义事务的结束。如果 TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放连接占用的资源,并将 TRANCOUNT 减少到 0。如果 TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 TRANCOUNT 按 1 递减。语法语法COMMIT TRAN SACTION transaction_name | tran_name_variable COMMIT TRANSACTION注释注释只有当事务所引用的所有数据的逻辑都正确时,发出 COMMIT TRANSACTIO

8、N 命令才是一个 Transact-SQL 程序员的职责。如果所提交的事务是 Transact-SQL 分布式事务,COMMIT TRANSACTION 将触发 MS DTC 使用两阶段提交协议,以便提交所有涉及该事务的服务器。如果局部事务跨越同一服务器上的两个或多个数据库,那么 SQL Server 将使用内部的两阶段提交来提交所有涉及该事务的数据库。当在嵌套事务中使用时,内部事务的提交并不释放资源或使其修改成为永久修改。只有在提交了外部事务时,数据修改才具有永久性,而且资源才会被释放。当 TRANCOUNT 大于 1 时,每发出一个 COMMIT TRANSACTION 命令就会使 TRA

9、NCOUNT 按 1 递减。当 TRANCOUNT 最终减少到 0 时,将提交整个外部事务。因为 transaction_name 被 SQL Server 忽略,所以当存在仅将 TRANCOUNT 按 1 递减的显著内部事务时,发出一个引用外部事务名称的 COMMIT TRANSACTION。当 TRANCOUNT 为 0 时发出 COMMIT TRANSACTION 将会导致出现错误,因为没有相应的 BEGIN TRANSACTION。不能在发出一个 COMMIT TRANSACTION 语句之后回滚事务,因为数据修改已经成为数据库的一个永久部分。XACT_ABORTXACT_ABORT为

10、on时,如果发生错误会自动回滚,off时只回滚成为的事务,默认为Off事务处理的例子命名事务下例说明如何命名事务。DECLARE TranName VARCHAR(20)SELECT TranName = MyTransactionBEGIN TRANSACTION TranNameUPDATE royschedSET royalty = royalty * 1.10WHERE title_id LIKE Pc%COMMIT TRANSACTION MyTransaction提交事务。提交事务。下面的示例在图书的截止当前销售额超过 $8,000 时,增加支付给作者的预付款。BEGIN TRAN

11、SACTION UPDATE titles SET advance = advance * 1.25 WHERE ytd_sales 8000 COMMIT提交嵌套事务例子提交嵌套事务例子下面的示例创建一个表,生成三个级别的嵌套事务,然后提交该嵌套事务。尽管每个 COMMIT TRANSACTION 语句都有一个 transaction_name 参数,但是 COMMIT TRANSACTION 和 BEGIN TRANSACTION 语句之间没有任何关系。transaction_name 参数仅是帮助阅读的方法,可帮助程序员确保提交的正确号码被编码以便将 TRANCOUNT 减少到 0,然后

12、提交外部事务。CREATE TABLE TestTran (Cola INT PRIMARY KEY, Colb CHAR(3)GOBEGIN TRANSACTION OuterTran - TRANCOUNT set to 1.GOINSERT INTO TestTran VALUES (1, aaa)GOBEGIN TRANSACTION Inner1 - TRANCOUNT set to 2.GO提交嵌套事务例子提交嵌套事务例子-续续INSERT INTO TestTran VALUES (2, bbb)GOBEGIN TRANSACTION Inner2 - TRANCOUNT set

13、 to 3.GOINSERT INTO TestTran VALUES (3, ccc)GOCOMMIT TRANSACTION Inner2 - Decrements TRANCOUNT to 2.- Nothing committed.GOCOMMIT TRANSACTION Inner1 - Decrements TRANCOUNT to 1.- Nothing committed.GOCOMMIT TRANSACTION OuterTran - Decrements TRANCOUNT to 0.- Commits outer transaction OuterTran.GOROLLB

14、ACK TRANSACTION将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。语法语法ROLLBACK TRAN SACTION transaction_name | tran_name_variable | savepoint_name | savepoint_variable 在执行 COMMIT TRANSACTION 语句后不能回滚事务。在事务内允许有重复的保存点名称,但 ROLLBACK TRANSACTION 若使用重复的保存点名称,则只回滚到最近的使用该保存点名称的 SAVE TRANSACTION。在存储过程中,不带 savepoint_name 和 transact

15、ion_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGIN TRANSACTION。在存储过程中,ROLLBACK TRANSACTION 语句使 TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的 TRANCOUNT 值,并且生成一个信息。该信息不影响后面的处理。事务控制语句开始事务语句开始事务语句该语句定义一个显示事务的开始。语法为BEGIN TRANSACTIONTRANSACTION_NAMEWITE MARKdescription提交事务语句提交事务语句COMMIT TRANSACTION语句结束一个用户定义的事务,保证对数据的

16、修改已经成功地写入数据库。语法如下: COMMIT TRANSACTION TRANSACTION_NAME回滚事务语句回滚事务语句ROLLBACK TRANSACTION语句回滚一个事务到事务的开始处或一个保存点。语法如下: ROLLBACK TRANSACTION transaction_name|savepoint_name保存事务断点语句保存事务断点语句SAVE TRANSACTION用于在事务中设置一个保存点。它可以使一个事务内的部分操作回滚。 SAVE TRANSACTIONSAVEPOINT_NAME部分回滚如果事务设置了保存点,则事务将回滚到由保存点指定的位置并发控制同一时刻有

17、很多事务在操作数据库数据的不一致性情况丢失修改读“脏”数据不可重复读“幻影”读基于事务隔离级别的并发控制使用READ UNCOMMITTED使用READ COMMITTED使用Repeatable Read分布式事务如果要在事务中(包括存储过程)存储多个数据库服务器中的数据,那么就必须使用“分布式事务”。此时由于工作必须分散到多个服务器中进行,因此必须有一个协调者来负责统筹整个事务管理工作,而它就是在第一章介绍的MSDTC服务。在开始分布事务之前,请记住先启动MSDTC服务,否则会出现错误信息。执行分布式事务很简单,只要将BEGIN TRANSACTION换成BEGIN DISTRIBUTEDTRANSACTION即可,其他部分都不必改动。分布式事务例子BEGIN DISTRIBUTED TRANSACTIONUPDATE authorsSET au_lname

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论