SQLServer之创建显式事务
显式事务定义
显式事务以 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之创建显式事务的更多相关文章
- SQLServer之创建隐式事务
隐式事务创建注意事项 IMPLICIT_TRANSACTIONS为 ON 时,系统处于“隐式”事务模式. 这意味着如果 @@TRANCOUNT = 0,下列任一 Transact-SQL 语句都会开始 ...
- 基于 Transaction 类的分布式显式事务
自.NET2.0以来增加了System.Transactions命名空间,为.NET应用程序带来了一个新的事务编程模型. 这个命名空间提供了几个依赖的TransactionXXX类.Transacti ...
- SQL Server显式事务与隐式事务
事务是单个的工作单元.如果某一事务成功,则在该事务中进行的所有数据修改均会提交,成为数据库中的永久组成部分.如果事务遇到错误且必须取消或回滚,则所有数据库修改均被清除. SQL Server中有一下几 ...
- (4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务)
(4.19)sql server中的事务模式(隐式事务,显式事务,自动提交事务) 1.概念:隐式事务,显式事务,自动提交事务 2.操作:如何设置事务模式 3.存储过程中的事务 XACT_ABORT 1 ...
- SQL Server Insert时开启显式事务
如果没法避免一条一条的写入,那么在处理前显示开启一个事务 begin tran 在处理完成后 commit 这样也要比不开显示事务会快很多! while i < 10000begin inse ...
- SpringBoot显式事务
参考:https://www.jianshu.com/p/f5fc14bde8a0 后续测试代码的完整项目:https://files.cnblogs.com/files/hellohello/dem ...
- CALayer的隐式动画和显式动画
隐式事务 任何对于CALayer属性的修改,都是隐式事务,都会有动画效果.这样的事务会在run-loop中被提交. - (void)viewDidLoad { //初始化一个layer,添加到主视图 ...
- SQLServer之创建分布式事务
分布式事务创建注意事项 指定一个由 Transact-SQL 分布式事务处理协调器 (MS DTC) 管理的 Microsoft 分布式事务的起点. 执行 BEGIN DISTRIBUTED TRAN ...
- C# 显式创建线程 or 使用线程池线程--new Thread() or ThreadPool.QueueUserWorkItem()
在C#多线程编程中,关于是使用自己创建的线程(Thread)还是使用线程池(ThreadPool)线程,一直很困惑,知道看了Jeffrey Richter的相关介绍才明白,记录如下: 当满足一下任何条 ...
随机推荐
- 白话说java gc垃圾回收
gc是java区别于其他好几门语言(c/c++)的一个代表功能(当然也有很多可以自动管理内存的语言,如所有的脚本语言,你根本不知道内存管理这回事)! 当然,之所以要把c/c++和java相比,是因为j ...
- web开发中获取的各种高度和宽度
前端开发中经常需要获取页面还有屏幕的高度和宽度进行计算,此文即介绍如何用 JavaScript 还有 jQuery 获取这些尺寸. 1.简介 一个页面显示在浏览器内,浏览器又放置在屏幕窗口内,所以由里 ...
- 第一次c语言上机
实验结论 part1: 第一部分的内容是按照书上所给的例题,进行简单的验证.虽然听起来很简单,但是由于之前并未接触过这方面的内容,还是犯了很多微小的错误.主要是在进行编程语言的输入时会输错字母,会忘记 ...
- [Abp 源码分析]一、Abp 框架启动流程分析
Abp 不一定仅用于 Asp.Net Core 项目,他也可以在 Console 与 WinFrom 项目当中进行使用,所以关于启动流程可以分为两种,一种是 Asp.Net Core 项目的启动流程, ...
- JVM基础系列第1讲:Java 语言的前世今生
Java 语言是一门存在了 20 多年的语言,其年纪比我自己还大.虽然存在了这么长时间,但 Java 至今都是最大的工业级语言,许多大型互联网公司均采用 Java 来实现其业务系统.大到国际电商巨头阿 ...
- logback配置信息
<?xml version="1.0" encoding="UTF-8"?> <configuration scan="true&q ...
- [六]JavaIO之 ByteArrayInputStream与ByteArrayOutputStream
功能简介 ByteArrayInputStream 和 ByteArrayOutputStream 提供了针对于字符数组 byte [] 的标准的IO操作方式 ByteArrayInp ...
- ubuntu 15.10 设置静态ip 分配固定ip 设置dns 设置网关 命令行配置ip 固定ip不生效怎么办
要用到的文件: 配置接口信息 /etc/network/interfaces 配置内容: auto eth0 iface eth0 inet static address 192.168.216.18 ...
- plsql的database下拉为空,如何解决?
如何解决plsql的database下拉为空? 为什么plsql的database下拉为空?我在tnsnames.ora中设置了字符串ORCL,疑惑了我好久,在网上找了许久解决方案,终于是解决了!如下 ...
- 【.NET Core项目实战-统一认证平台】第十一章 授权篇-密码授权模式
[.NET Core项目实战-统一认证平台]开篇及目录索引 上篇文章介绍了基于Ids4客户端授权的原理及如何实现自定义的客户端授权,并配合网关实现了统一的授权异常返回值和权限配置等相关功能,本篇将介绍 ...