事务定义: 事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会 提交,成为数据库中的{yj}组成部分。如果事务遇到错误且必须取消或回滚,则所有 数据更改均被xx。 事务三种运行模式:自动提交事务每条单独的语句都是一个事务。显式事务每个事务均以 BEGIN TRANSACTION 语句显式开始,以 COMMIT 或 ROLLBACK 语句显式结束。隐性事务在前一个事务完成时新事务隐式启动,但每个事务仍以 COMMIT 或 ROLLBACK 语句 显式完成。 事务操作的语法: BEGIN TRANSACTION BEGIN TRANSACTION标记一个显式本地事务的起始点。 BEGIN TRANSACTION将 @@TRANCOUNT 加 1。 BEGIN TRANSACTION 代表一点,由连接引用的数据在该点是逻辑和物理上都一致的。如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作{yj}的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动 语法 例子: BEGIN DISTRIBUTED TRANSACTION指定一个由 Microsoft 分布式事务处理协调器 (MS DTC) 管理的 Transact-SQL 分布式事务的起始。 语法 参数 @tran_name_variable是用户定义的一个变量名,它含有一个事务名,该事务名用于跟踪 MS DTC 实用工具中的分布式事务。必须用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。 注释执行BEGIN DISTRIBUTED TRANSACTION 语句的服务器是事务创建人,并且控制事务的完成 当连接发出后续 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句时,主控服务器请求 MS DTC 在所涉及的服务器间管理分布式事务的完成。有两个方法可将远程 SQL 服务器登记在一个分布式事务中: 分布式事务中已登记的连接执行一个远程存储过程调用,该调用引用一个远程服务器。 分布式事务中已登记的连接执行一个分布式查询,该查询引用一个远程服务器。 示例本例在本地和远程数据库上更新作者的姓。本地和远程数据库将同时提交或同时回滚本事务。 说明 当前的SQL Server 上必须安装 MS DTC. USE pubs SET XACT_ABORT指定当 Transact-SQL 语句产生运行时错误时,Microsoft? SQL Server? 是否自动回滚当前事务。 ( 可以比较简单的理解,如果中间有任何一句SQL 出错,所有SQL全部回滚.特别适用于 Procedure 中间调用Procedure ,如果{dy}个Procedure Ok,被调用的Procedure 中间有错误,如果SET XACT_ABORT=false,则出错的部分回滚,其他部分提交,当然外部Procedure 也提交。). ---在分布式Trans中一定要注意设置下面参数(XACT_ABORT) 语法SET XACT_ABORT { ON | OFF } 注释当 SET XACT_ABORT 为 ON 时,如果 Transact-SQL 语句产生运行时错误,整个事务将终止并回滚。为 OFF 时,只回滚产生错误的Transact-SQL 语句,而事务将继续进行处理。编译错误(如语法错误)不受 SET XACT_ABORT 的影响。 对于大多数 OLE DB 提供程序(包括 SQL Server),隐性或显式事务中的数据修改语句必须将 XACT_ABORT 设置为 ON。 SET XACT_ABORT 的设置是在执行或运行时设置,而不是在分析时设置。 示例下例导致在含有其它 Transact-SQL 语句的事务中发生违反外键错误。在{dy}个语句集中产生错误,但其它语句均成功执行且事务成功提交。在第二个语句集中,SET XACT_ABORT 设置为 ON。这导致语句错误使批处理终止,并使事务回滚。 CREATE TABLE t1 (a int PRIMARY KEY) SAVE TRANSACTION在事务内设置保存点。 语法 SAVE TRAN [ SACTION ] { savepoint_name | @savepoint_variable }参数 savepoint_name是指派给保存点的名称。保存点名称必须符合标识符规则,但只使用前 32 个字符。 Note:1:在由 BEGIN DISTRIBUTED TRANSACTION 显式启动或从本地事务升级而来的分布式事务中,不支持 SAVE TRANSACTION。 2:当事务开始时,将一直控制事务中所使用的资源直到事务完成(也就是锁定)。当将事务的一部分回滚到保存点时,将继续控制资源直到事务完成(或者回滚全部事务)。 例子:begin transaction ROLLBACK TRANSACTION 将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。语法 参数 注释 ROLLBACK TRANSACTION xx自事务的起点或到某个保存点所做的所有数据修改。ROLLBACK 还释放由事务控制的资源。不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 回滚到事务的起点。嵌套事务时,该语句将所有内层事务回滚到最远的 BEGIN TRANSACTION 语句。在这两种情况下,ROLLBACK TRANSACTION 均将 @@TRANCOUNT 系统函数减为 0。ROLLBACK Note: 在存储过程中,不带 savepoint_name 和 transaction_name 的 ROLLBACK TRANSACTION 语句将所有语句回滚到最远的 BEGINTRANSACTION。在存储过程中,ROLLBACK TRANSACTION 语句使 @@TRANCOUNT 在触发器完成时的值不同于调用该存储过程时的@@TRANCOUNT 值,并且生成一个信息。该信息不影响后面的处理。 如果在触发器中发出 ROLLBACK TRANSACTION:将回滚对当前事务中的那一点所做的所有数据修改,包括触发器所做的修改。 触发器继续执行 ROLLBACK 语句之后的所有其余语句。如果这些语句中的任意语句修改数据,则不回滚这些修改。执行其余的语句不会激发嵌套触发器。在批处理中,不执行所有位于激发触发器的语句之后的语句。每次进入触发器,@@TRANCOUNT 就增加 1,即使在自动提交模式下也是如此。(系统将触发器视作隐性嵌套事务。) ROLLBACK TRANSACTION 语句不生成显示给用户的信息。如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。RAISERROR 是用于指出错误的{sx}语句。 ROLLBACK 对游标的影响由下面三个规则定义: 当 CURSOR_CLOSE_ON_COMMIT 设置为 ON 时,ROLLBACK 关闭但不释放所有打开的游标。 当 CURSOR_CLOSE_ON_COMMIT 设置为 OFF 时,ROLLBACK 不影响任何打开的同步 STATIC 或 INSENSITIVE 游标不影响已xx填充的异步 STATIC 游标。将关闭但不释放任何其它类型的打开的游标。 对于导致终止批处理并生成内部回滚的错误,将释放在含有该错误语句的批处理内声明的所有游标。不论游标的类型或 CURSOR_CLOSE_ON_COMMIT 的设置,所有游标均将被释放,其中包括在该错误批处理所调用的存储过程内声明的游标。在该错误批处理之前的批处理内声明的游标以规则 1 和 2 为准。死锁错误就属于这类错误。在触发器中发出的 ROLLBACK 语句也自动生成这类错误。 权限 begin transaction -- select * into demo2 from demo1 create table demo2(name varchar(10),age int) COMMIT TRANSACTION标志一个成功的隐性事务或用户定义事务的结束。如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的{yj}部分,释放连接 占用的资源,并将 @@TRANCOUNT 减少到 0。如果@@TRANCOUNT 大于 1,则COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减。 只有当事务所引用的所有数据的逻辑都正确时,发出 COMMIT TRANSACTION 命令。COMMIT WORK标志事务的结束。语法 注释此语句的功能与 COMMIT TRANSACTION 相同,但 COMMIT TRANSACTION 接受用户定义的事务 名称。这个指定或没有指定可选关键字WORK 的 COMMIT 语法与 SQL-92 兼容 例子: 隐性事务当连接以隐性事务模式进行操作时,SQL Server将在提交或回滚当前事务后自动启动新事务。无须描述事务的开始,只需提交或 回滚每个事务。隐性事务模式生成连续的事务链。 在为连接将隐性事务模式设置为打开之后,当 SQL Server 首次执行下列任何语句时,都会自动启动一个事务: 在发出 COMMIT 或 ROLLBACK 语句之前,该事务将一直保持有效。在{dy}个事务被提交或回滚之后,下次当连接执行这些语句 中的任何语句时,SQL Server 都将自动启动一个新事务。SQL Server 将不断地生成一个隐性事务链, 直到隐性事务模式关闭为止 例子: insert into demo values('BB','B term') create table demo2(name varchar(10),age int) 嵌套事务处理: 1: Trans 嵌套,将内部的trans 合并到外部并形成一个Trans. begin tran t1 ----In the first trans . ---Second Trans begin transaction t2 ----In the first trans . Note: 在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。系统仅登记{dy}个(最外部的)事务名。回滚 到其它任何名字(有效的保存点名除外)都会产生错误。 事实上,任何在回滚之前执行的语句都没有在错误发生时回滚。这语句仅当外层的事务回滚时才会进行回滚。 例:内部事务回滚SQL server 报错。 begin tran t1 --Server: Msg 6401, Level 16, State 1, Line 6 例:内部事务提交SQL server 不会报错。 begin tran t1 SQL Server 的隔离级别: 1: 设置TimeOut 参数 Set Lock_TimeOut 5000 被锁超时5秒将自动解锁 Set Lock_TimeOut 0 产立即解锁,返回Error 默认为-1,无限等待 2: (SET TRANSACTION ISOLATION LEVEL READ COMMITTED 指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或 幻像数据。该选项是SQL Server 的默认值。 避免脏读,并在其他session 在事务中不能对已有数据进行修改。共享锁。 READ UNCOMMITTED 执行脏读或 0 级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数 据执行未提交读或脏读;在事务结束前可以更改数据内的数值,行也可以出现在数据集中或从数据 集消失。该选项的作用与在事务内所有语句中的所有表上设置 NOLOCK 相同。这是四个隔离级别中 限制最小的级别。 REPEATABLE READ 锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据 集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使 用该选项。 SERIALIZABLE 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这 是四个隔离级别中限制{zd0}的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项 的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同 |