显式事务定义

显式事务以 BEGIN TRANSACTION 语句开始,并以 COMMIT 或 ROLLBACK 语句结束。

备注

BEGIN TRANSACTION 使 @@TRANCOUNT 按 1 递增。

BEGIN TRANSACTION 代表一点,由连接引用的数据在该点逻辑和物理上都一致的。 如果遇上错误,在 BEGIN TRANSACTION 之后的所有数据改动都能进行回滚,以将数据返回到已知的一致状态。 每个事务继续执行直到它无误地完成并且用 COMMIT TRANSACTION 对数据库作永久的改动,或者遇上错误并且用 ROLLBACK TRANSACTION 语句擦除所有改动。

BEGIN TRANSACTION 为发出本语句的连接启动一个本地事务。 根据当前事务隔离级别的设置,为支持该连接所发出的 Transact-SQL 语句而获取的许多资源被该事务锁定,直到使用 COMMIT TRANSACTION 或 ROLLBACK TRANSACTION 语句完成该事务为止。 长时间处于未完成状态的事务会阻止其他用户访问这些锁定的资源,也会阻止日志截断。

虽然 BEGIN TRANSACTION 启动一个本地事务,但是在应用程序接下来执行一个必须记录的操作(如执行 INSERT、UPDATE 或 DELETE 语句)之前,它并不被记录在事务日志中。 应用程序能执行一些操作,例如为了保护 SELECT 语句的事务隔离级别而获取锁,但是直到应用程序执行一个修改操作后日志中才有记录。

在一系列嵌套的事务中用一个事务名给多个事务命名对该事务没有什么影响。 系统仅登记第一个(最外部的)事务名。 回滚到其他任何名称(有效的保存点名除外)都会产生错误。 事实上,回滚之前执行的任何语句都不会在错误发生时回滚。 这些语句仅当外层的事务回滚时才会进行回滚。

如果在语句提交或回滚之前执行了如下操作,由 BEGIN TRANSACTION 语句启动的本地事务将升级为分布式事务:

  • 执行一个引用链接服务器上的远程表的 INSERT、DELETE 或 UPDATE 语句。 如果用于访问链接服务器的 OLE DB 访问接口不支持 ITransactionJoin 接口,则 INSERT、UPDATE 或 DELETE 语句会失败。

  • 当启用了 REMOTE_PROC_TRANSACTIONS 选项时,将调用远程存储过程。

    SQL Server 的本地副本成为事务控制器并且使用 Microsoft 分布式事务处理协调器 (MS DTC) 来管理分布式事务。

    使用 BEGIN DISTRIBUTED TRANSACTION 可以将事务作为分布式事务显式执行。 有关详细信息,请参阅 BEGIN DISTRIBUTED TRANSACTION (Transact-SQL)。

    SET IMPLICIT_TRANSACTIONS 设置为 ON 时,BEGIN TRANSACTION 语句创建两个嵌套的事务。 有关详细信息,请参阅 SET IMPLICIT_TRANSACTIONS (Transact-SQL)

标记的事务

WITH MARK 选项使事务名被置于事务日志中。 将数据库还原到早期状态时,可使用标记事务代替日期和时间。 有关详细信息,请参阅 使用标记的事务一致地恢复相关的数据库的事务(完全恢复模式)和 RESTORE (Transact-SQL)。

另外,若要将一组相关数据库恢复到逻辑上一致的状态,必须使用事务日志标记。 标记可由分布式事务置于相关数据库的事务日志中。 将这组相关数据库恢复到这些标记将产生一组在事务上一致的数据库。 在相关数据库中放置标记需要特殊的过程。

只有当数据库由标记事务更新时,才在事务日志中放置标记。 不修改数据的事务不被标记。

使用T-SQL脚本创建显式事务

语法:

--声明数据库引用
use 数据库名称;
go

begin { tran| transaction } [ { transaction_name | @tran_name_variable } [ with mark [ 'description' ] ]
begin
业务代码1;

save  { tran | transaction } { savepoint_name | @savepoint_variable };

rollback { tran | transaction } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ];

commit { tran | transaction }  { transaction_name | @tran_name_variable } with(delayed_durability=on);

end
go

语法解析:

--begin transaction transaction_name
--适用范围:SQL Server(从 2008 版开始)和 Azure SQL Database
--分配给事务的名称。 transaction_name 必须符合标识符规则,但标识符所包含的字符数不能大于 32。 仅在最外面的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 嵌套语句对中使用事务名。
--transaction_name 始终区分大小写,即使 SQL Server 实例不区分大小写也是如此。

--begin transaction @tran_name_variable 
--适用范围:SQL Server(从 2008 版开始)和 Azure SQL Database
--用户定义的、含有有效事务名称的变量的名称。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。 如果传递给该变量的字符多于 32 个,则仅使用前面的 32 个字符;其余的字符将被截断。

--with mark [ 'description' ]
--适用范围:SQL Server(从 2008 版开始)和 Azure SQL Database
--指定在日志中标记事务。 description 是描述该标记的字符串。 在将长于 128 个字符的 description 存储到 msdb.dbo.logmarkhistory 表中之前,先将其截断为 128 个字符。
--如果使用了 WITH MARK,则必须指定事务名。 WITH MARK 允许将事务日志还原到命名标记。

--save transaction savepoint_name
--分配给保存点的名称。 保存点名称必须符合标识符的规则,但长度不能超过 32 个字符。 savepoint_name 始终区分大小写,即使 SQL Server 实例不区分大小写也是如此。

--save transaction @savepoint_variable 
--包含有效保存点名称的用户定义变量的名称。 必须使用 char、varchar、nchar 或 nvarchar 数据类型声明该变量。 如果长度超过 32 个字符,也可以传递到变量,但只使用前 32 个字符。

--rollback { tran | transaction } [ transaction_name | @tran_name_variable | savepoint_name | @savepoint_variable ];
--将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。 可以使用 ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。 它还释放由事务控制的资源。

--commit { tran | transaction } { transaction_name | @tran_name_variable };
--标志一个成功的隐性事务或显式事务的结束。 如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将 @@TRANCOUNT 减少到 0。
--如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减并且事务将保持活动状态。

--delayed_durability
--适用范围:SQL Server 和 Azure SQL 数据库
--请求将此事务与延迟持续性一起提交的选项。 如果已用 DELAYED_DURABILITY = DISABLED 或 DELAYED_DURABILITY = FORCED 更改了数据库,则忽略该请求。 有关详细信息,请参阅主题控制事务持续性。

示例:

--声明数据库引用
use testss;
go

begin transaction explicittran
with mark '开启一个显式事务'
begin
declare @counts int =0;

insert into test1(name,sex,age,classid,height) values('事务测试','男','21','20','178');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran1;--回滚点一,事务已经插入了一条数据

insert into test2(name) values('事务测试');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran2;--回滚点二,事务已经插入了二条数据

insert into test3(name,sex,age,classid) values('事务班','男','asd','23');
set @counts=@counts+(select @@ROWCOUNT);
save tran inserttran3;--回滚点三,事务已经插入了三条数据

--出错回滚到回滚点
if @counts=3
rollback transaction inserttran3;
else if @counts=2
rollback transaction inserttran2;
else if @counts=1
rollback transaction inserttran1;

--提交事务或者回滚事务
if @counts<>0
commit transaction explicittran
--with(delayed_durability=on)
;
else
rollback transaction explicittran;
end
go

示例结果:

SQLServer之创建显式事务的更多相关文章

  1. SQLServer之创建隐式事务

    隐式事务创建注意事项 IMPLICIT_TRANSACTIONS为 ON 时,系统处于“隐式”事务模式. 这意味着如果 @@TRANCOUNT = 0,下列任一 Transact-SQL 语句都会开始 ...

  2. 基于 Transaction 类的分布式显式事务

    自.NET2.0以来增加了System.Transactions命名空间,为.NET应用程序带来了一个新的事务编程模型. 这个命名空间提供了几个依赖的TransactionXXX类.Transacti ...

  3. SQL Server显式事务与隐式事务

    事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据库修改均被清除. SQL Server中有一下几 ...

  4. (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)

    (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务) 1.概念:隐式事务,显式事务,自动提交事务 2.操作:如何设置事务模式 3.存储过程中的事务 XACT_ABORT 1 ...

  5. SQL Server Insert时开启显式事务

    如果没法避免一条一条的写入,那么在处理前显示开启一个事务 begin tran  在处理完成后 commit 这样也要比不开显示事务会快很多! while i < 10000begin inse ...

  6. SpringBoot显式事务

    参考:https://www.jianshu.com/p/f5fc14bde8a0 后续测试代码的完整项目:https://files.cnblogs.com/files/hellohello/dem ...

  7. CALayer的隐式动画和显式动画

    隐式事务 任何对于CALayer属性的修改,都是隐式事务,都会有动画效果.这样的事务会在run-loop中被提交. - (void)viewDidLoad { //初始化一个layer,添加到主视图 ...

  8. SQLServer之创建分布式事务

    分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...

  9. C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()

    在C#多线程编程中,关于是使用自己创建的线程(Thread)还是使用线程池(ThreadPool)线程,一直很困惑,知道看了Jeffrey Richter的相关介绍才明白,记录如下: 当满足一下任何条 ...

随机推荐

  1. [Swift]LeetCode881. 救生艇 | Boats to Save People

    The i-th person has weight people[i], and each boat can carry a maximum weight of limit. Each boat c ...

  2. [Swift]LeetCode894. 所有可能的满二叉树 | All Possible Full Binary Trees

    A full binary tree is a binary tree where each node has exactly 0 or 2 children. Return a list of al ...

  3. 想成为Python全栈开发工程师必须掌握的技能

    什么是Python全栈工程师? 即从前端页面的实现,到后台代码的编写,再到数据库的管理,一人可以搞定一个公司网站的所有事情,真正实现全栈开发. 全栈只是个概念 也分很多种类 真正的全栈工程师涵盖了we ...

  4. SH2018笔试题之成长值问题

    一.题目 详见代码 二.代码 import java.util.Scanner; /** * 3 * 1 1 5 10 * 2 3 4 * 1 4 6 -5 */ public class main4 ...

  5. Django+Bootstrap+Mysql 搭建个人博客(五)

    5.1.自定义403,404和500页面 (1)website/urls.py from blog import views as blog_views handler403 = blog_views ...

  6. 【Docker】(3)---linux部署Docker、Docker常用命令

    linux部署Docker.Docker常用命令 本次部署Linux版本:CentOS 7.4 64位. 说明: 因为Docker是基于Linux 64bit的 所以Docker要求64位的系统且内核 ...

  7. http缓存与离线缓存

    一.http协议实现缓存 1. 缓存头部 通用缓存.条件缓存.缓存控制三大类 头部名称 说明 请求/响应 通用缓存头部 控制客户端是否向服务器发送请求或者是服务端响应请求   cache-contro ...

  8. asp.net core 系列 11 配置configuration (下)

    四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定 ...

  9. 前端笔记之jQuery(上)加载函数的区别&对象&操作HTML/CSS&动画&选择器

    一.jQuery简介 1.0 JavaScript编程比较恶心的地方 恶心1:选择元素麻烦,全线兼容的方法只有getElementById()和getElementsByTagName()两个.其他的 ...

  10. Java开发知识之Java中的集合Set接口以及子类应用

    ---恢复内容开始--- Java开发知识之Java中的集合Set接口以及子类应用 一丶Set接口以及作用 在上一讲.我们熟悉了接口的实现图.以及自己各有的子类. List接口主要存储的数据是可以重复 ...