显式事务定义

显式事务以 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. This relative module was not found:

    晚上项目敲完,关机睡觉!  早上醒来-----打开项目,惊呆了 !This relative module was not found: 如图   这个报错,我当时怎么也没看懂!!!   后来经过测试 ...

  2. python编译、运行、反编译pyc文件

    为了加密 .py 文件,以前一般使用打包成 exe ,但是最近发现可以将其编译成二进制文件 pyc ,虽然反编译难度不大,但是也需要一些水平 编译生成 pyc: 单个文件 代码: import py_ ...

  3. Linux下python2和python3共存

    python下载地址: https://www.python.org/ftp/python/3.4.4/Python-3.4.4.tar.xz 下载命令: wget https://www.pytho ...

  4. JVM基础系列第14讲:JVM参数之GC日志配置

    说到 Java 虚拟机,不得不提的就是 Java 虚拟机的 GC(Garbage Collection)日志.而对于 GC 日志,我们不仅要学会看懂,而且要学会如何设置对应的 GC 日志参数.今天就让 ...

  5. Jquery.tmpl

     它是一个基于jquery的模板展示插件,有了它就可以去展示JSON数据渲染到HTML页中!一.使用方法引入Jquery引入 tmpl<script src="../Scripts/j ...

  6. 获取Android设备唯一标识码

    概述 有时需要对用户设备进行标识,所以希望能够得到一个稳定可靠并且唯一的识别码.虽然Android系统中提供了这样设备识别码,但是由于Android系统版本.厂商定制系统中的Bug等限制,稳定性和唯一 ...

  7. Node.js 中的 stream

    什么是 stream Stream 借鉴自 Unix 编程哲学中的 pipe. Unix shell 命令中,管道式的操作 | 将上一个命令的输出作为下一个命令的输入.Node.js stream 中 ...

  8. RabbitMQ消息队列(十四)-启用SSL安全通讯

    如果RabbitMQ服务在内网中,只有内网的应用连接,我们认为这些连接都是安全的,但是个别情况我们需要让RabbitMQ对外提供服务.这种情况有两种解决方案: 在RabbitMQ外层在封装一层应用,应 ...

  9. springboot情操陶冶-web配置(二)

    承接前文springboot情操陶冶-web配置(一),在分析mvc的配置之前先了解下其默认的错误界面是如何显示的 404界面 springboot有个比较有趣的配置server.error.whit ...

  10. 适用于app.config与web.config的ConfigUtil读写工具类

    之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一个更完善的版本,增加批量读写以及指定配置文件路径,代码如下: using System ...