事务操作(BEGIN/COMMIT/ROLLBACK/SAVE TRANSACTION)
BEGIN TRANSACTION
标记一个显式本地事务的起始点。 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 { TRAN | TRANSACTION }
[ { transaction_name | @tran_name_variable }
[ WITH MARK [ 'description' ] ]
]
[ ; ]
参数
transaction_name
分配给事务的名称。 transaction_name 必须符合标识符规则,但标识符所包含的字符数不能大于 32。 仅在最外面的 BEGIN...COMMIT 或 BEGIN...ROLLBACK 嵌套语句对中使用事务名。 transaction_name 始终是区分大小写的,即使 SQL Server 实例不区分大小写也是如此。
@tran_name_variable
用户定义的、含有有效事务名称的变量的名称。 必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。 如果传递给该变量的字符多于 32 个,则仅使用前面的 32 个字符;其余的字符将被截断。
WITH MARK [ 'description' ]
指定在日志中标记事务。 description 是描述该标记的字符串。 长于 128 个字符的 description 先截断为 128 个字符,然后才存储到 msdb.dbo.logmarkhistory 表中。
如果使用了 WITH MARK,则必须指定事务名。 WITH MARK 允许将事务日志还原到命名标记。
COMMIT TRANSACTION
标志一个成功的隐性事务或显式事务的结束。仅当事务引用的所有数据在逻辑上都正确时,才应发出 COMMIT TRANSACTION 命令。 如果 @@TRANCOUNT 为 1,COMMIT TRANSACTION 使得自从事务开始以来所执行的所有数据修改成为数据库的永久部分,释放事务所占用的资源,并将 @@TRANCOUNT 减少到 0。如果 @@TRANCOUNT 大于 1,则 COMMIT TRANSACTION 使 @@TRANCOUNT 按 1 递减并且事务将保持活动状态。
如果所提交的事务是 Transact-SQL 分布式事务,COMMIT TRANSACTION 将触发 MS DTC 使用两阶段提交协议,以便提交所有涉及该事务的服务器。 如果本地事务跨越同一数据库引擎实例上的两个或多个数据库,则该实例将使用内部的两阶段提交来提交所有涉及该事务的数据库。当 @@TRANCOUNT 为 0 时发出 COMMIT TRANSACTION 将会导致出现错误;因为没有相应的 BEGIN TRANSACTION。
不能在发出一个 COMMIT TRANSACTION 语句之后回滚事务,因为数据修改已经成为数据库的一个永久部分。
仅当事务计数在语句开始处为 0 时,数据库引擎才会增加语句内的事务计数。
语法
COMMIT [ { TRAN | TRANSACTION } [ transaction_name | @tran_name_variable ] ] [ WITH ( DELAYED_DURABILITY = { OFF | ON } ) ]
[ ; ]
参数
transaction_name
SQL Server 数据库引擎忽略此参数。 transaction_name 指定由前面的 BEGIN TRANSACTION 分配的事务名称。 transaction_name 必须符合标识符规则,但不能超过 32 个字符。 transaction_name 通过向程序员指明 COMMIT TRANSACTION 与哪些 BEGIN TRANSACTION 相关联,可作为帮助阅读的一种方法。
@tran_name_variable
用户定义的、含有有效事务名称的变量的名称。 必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。 如果传递给该变量的字符数超过 32,则只使用 32 个字符,其余的字符将被截断。
DELAYED_DURABILITY
请求将此事务与延迟持续性一起提交的选项。 如果已用 DELAYED_DURABILITY = DISABLED 或DELAYED_DURABILITY = FORCED 更改了数据库,则忽略该请求。
ROLLBACK TRANSACTION
将显式事务或隐性事务回滚到事务的起点或事务内的某个保存点。 可以使用 ROLLBACK TRANSACTION 清除自事务的起点或到某个保存点所做的所有数据修改。 它还释放由事务控制的资源。ROLLBACK TRANSACTION 语句不生成显示给用户的消息。 如果在存储过程或触发器中需要警告,请使用 RAISERROR 或 PRINT 语句。 RAISERROR 是用于指出错误的首选语句。
语法
ROLLBACK { TRAN | TRANSACTION }
[ transaction_name | @tran_name_variable
| savepoint_name | @savepoint_variable ]
[ ; ]
参数
transaction_name
是为 BEGIN TRANSACTION 上的事务分配的名称。 transaction_name 必须符合标识符规则,但只使用事务名称的前 32 个字符。 嵌套事务时,transaction_name 必须是最外面的 BEGIN TRANSACTION 语句中的名称。 transaction_name 始终是区分大小写的,即使 SQL Server 实例不区分大小写也是如此。
@ tran_name_variable
用户定义的、含有有效事务名称的变量的名称。 必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。
savepoint_name
是 SAVE TRANSACTION 语句中的 savepoint_name。 savepoint_name 必须符合有关标识符的规则。 当条件回滚应只影响事务的一部分时,可使用 savepoint_name。
@ savepoint_variable
是用户定义的、包含有效保存点名称的变量的名称。 必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。
SAVE TRANSACTION
在事务内设置保存点。保存点可以定义在按条件取消某个事务的一部分后,该事务可以返回的一个位置。 如果将事务回滚到保存点,则根据需要必须完成其他剩余的 Transact-SQL 语句和 COMMIT TRANSACTION 语句,或者必须通过将事务回滚到起始点完全取消事务。 若要取消整个事务,请使用 ROLLBACK TRANSACTION transaction_name 语句。 这将撤消事务的所有语句和过程。在事务中允许有重复的保存点名称,但指定保存点名称的 ROLLBACK TRANSACTION 语句只将事务回滚到使用该名称的最近的 SAVE TRANSACTION。
语法
SAVE { TRAN | TRANSACTION } { savepoint_name | @savepoint_variable }
[ ; ]
参数
savepoint_name
分配给保存点的名称。 保存点名称必须符合标识符的规则,但长度不能超过 32 个字符。 transaction_name始终是区分大小写的,即使 SQL Server 实例不区分大小写也是如此。
@savepoint_variable
包含有效保存点名称的用户定义变量的名称。 必须用 char、varchar、nchar 或 nvarchar 数据类型声明变量。 如果长度超过 32 个字符,也可以传递到变量,但只使用前 32 个字符。
示例
以下示例说明如果活动事务是在执行存储过程之前启动的,如何使用事务保存点仅回滚存储过程所做的修改。
USE AdventureWorks2012;
GO
IF EXISTS (SELECT name FROM sys.objects
WHERE name = N'SaveTranExample')
DROP PROCEDURE SaveTranExample;
GO
CREATE PROCEDURE SaveTranExample
@InputCandidateID INT
AS
-- 检查是否是在活动的事务里面调用该存储过程(嵌套事务)
-- @TranCounter = 0 表示不是在活动事务里面调用
-- @TranCounter > 0表示在该存储过程调用之前已经有一个活动的事务
DECLARE @TranCounter INT;
SET @TranCounter = @@TRANCOUNT;
IF @TranCounter > 0
-- 在该存储过程调用之前已经有一个活动的事务。创建一个保存点,如果这个存储过程出错,只回滚到执行存储过程之前的操作。
SAVE TRANSACTION ProcedureSave;
ELSE
-- 创建一个新的事务
BEGIN TRANSACTION;
-- Modify database.
BEGIN TRY
DELETE HumanResources.JobCandidate
WHERE JobCandidateID = @InputCandidateID;
.
IF @TranCounter = 0
-- @TranCounter = 0 只在这个存储过程里面有事务,必须提交事务
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
-- 错误发生,需要去判断回滚级别
IF @TranCounter = 0
-- 事务只在此存储过程中,回滚整个事务
-- Roll back complete transaction.
ROLLBACK TRANSACTION;
ELSE
-- 事务在此存储过程开始之前已经创建(嵌套事务)
-- XACT_STATE(),用于报告当前正在运行的请求的用户事务状态的标量函数。 XACT_STATE 指示请求是否有活动的用户事务,以及是否能够提交该事务。
-- XACT_STATE() = 1 ,当前请求有活动的用户事务。 请求可以执行任何操作,包括写入数据和提交事务。
-- XACT_STATE() = 0,当前请求没有活动的用户事务。
-- XACT_STATE() = -1 ,当前请求具有活动的用户事务,但出现了致使事务被归类为无法提交的事务的错误。 请求无法提交事务或回滚到保存点;它只能请求完全回滚事务。
-- 请求在回滚事务之前无法执行任何写操作。 请求在回滚事务之前只能执行读操作。 事务回滚之后,请求便可执行读写操作并可开始新的事务。
IF XACT_STATE() <> -1
-- 回滚到此存储过程开始之前的错作。
ROLLBACK TRANSACTION ProcedureSave;
-- 输出错误信息
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT @ErrorMessage = ERROR_MESSAGE();
SELECT @ErrorSeverity = ERROR_SEVERITY();
SELECT @ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage,
@ErrorSeverity,
@ErrorState
);
END CATCH
GO
事务操作(BEGIN/COMMIT/ROLLBACK/SAVE TRANSACTION)的更多相关文章
- 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。
更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有
- MySql的事务操作与演示样例
事务就是一个逻辑工作单元的一系列步骤. 事务是用来保证数据操作的安全性 事务的特征: Atomicity(原子性) Consistency(稳定性,一致性) Isolation(隔离性) Durabi ...
- sqlserver中事务总结:begin tran,rollback tran,commit tran
第1个相关用法:摘自:https://shiyousan.com/post/f13d29b7-0d87-4168-bd8b-8b28b0991b5a 以下是出现错误的SQL部分语句: 此错误的原因是 ...
- SQL事务用法begin tran,commit tran和rollback tran的用法
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务. begin tran表示开始事务, commit tran表示提交 ...
- 【转】【SQLServer】SQL事务用法begin tran,commit tran和rollback tran的用法
Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务.begin tran表示开始事务, commit tran表示提交事 ...
- django 事务错误 -- Transaction managed block ended with pending COMMIT/ROLLBACK
Request Method: GET Request URL: http://192.168.128.111:8000/×××/××××/ Django Version: 1.4.8 Excepti ...
- 事务控制语句,begin,rollback,savepoint,隐式提交的SQL语句
事务控制语句 在MySQL命令行的默认设置下,事务都是自动提交的,即执行SQL语句后就会马上执行COMMIT操作.因此开始一个事务,必须使用BEGIN.START TRANSACTION,或者执行SE ...
- [转]How to nest transactions nicely - "begin transaction" vs "save transaction" and SQL Server
本文转自:http://geekswithblogs.net/bbiales/archive/2012/03/15/how-to-nest-transactions-nicely---quotbegi ...
- 【JDBC】学习路径7-转账-commit事务操作
现在我们要做一个转账系统. 第一章:创建一张新的表格(用户银行账户表格) 在之前的JDBC_01数据库中新增一个表格,名字为:Account 其中,有id.银行卡号.银行密码.账户余额. 创建表格 ...
随机推荐
- java之线程
java之线程 一:线程: 线程是什么呢?线程,有时被称为轻量级进程是程序执行流的最小单元.一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成.另外,线程是进程中的一个实体,是被系统 ...
- java 中的Scanner
java.util.Scanner是Java5的新特征,主要功能是简化文本扫描.这个类最实用的地方表现在获取控制台输入,其他的功能都很鸡肋,尽管Java API文档中列举了大量的API方法,但是都不怎 ...
- 【BZOJ-1419】Red is good 概率期望DP
1419: Red is good Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 660 Solved: 257[Submit][Status][Di ...
- .net 执行sql包含go语句的处理
今天工作中遇到了这个问题,其实只要把GO替换成“;”就行了,其它人写的例子用Split来拆分这一个脚本文件的内容,完全没有必要
- redis教程(整理中)
一.redis简介 1.Redis:键值对类型的内存数据库:应用于高并发和实时请求的场景: 2.Redis常用数据类型: (1) string(基本数据类型) (2)hash 注:hash中的 ...
- 大熊君学习html5系列之------requestAnimationFrame(实现动画的另一种方案)
一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻……,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...
- sqlplus连接oracle失败分析和解决
背景: 多台Linux服务器需要安装Oracle客户端,实现和Oracle数据库连接做业务处理. 安装完第一台后,直接将安装的目录压缩并复制到其他几台机器上,启动sqlplus连接数据库时,一直提示输 ...
- javascript数据结构-介绍
github博客地址 名词解释 数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率.数据结构 ...
- C# 构建XML(简单示例)
C# 构建XML的简单示例: var pars = new Dictionary<string, string> { {"url","https://www. ...
- Maven No compiler is provided in this environment. Perhaps you are running on a JRE rather than a JDK? 问题
maven编译项目时出错,提示信息如下: [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3 ...