SQL Server 中的回滚
USE [TestDB]
GO
/****** 对象: Table [dbo].[Person] 脚本日期: 11/23/2008 13:37:48 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[Person](
[PersonId] [nchar](18) NOT NULL,
[PersonName] [nchar](20) NOT NULL,
CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED
(
[PersonId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
默认情况下如果执行一个事务中出现错误,则只回滚错误操作语句(就是说这句不执行了,算不上回滚),错误处之前或之后的正确操作语句还是会被提交。如:
Use TestDB Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Insert Into Person(PersonId,PersonName)
Values('','Name3')
Commit TransAction
/*
Select 一下 有'1','Name1'和'3','Name3',
说明只有第二句的错误被取消了
*/
全部回滚的方法1:打开 XACT_ABORT
Use TestDB
SET XACT_ABORT ON -- 打开
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Insert Into Person(PersonId,PersonName)
Values('','Name3')
Commit TransAction
/*
当 SET XACT_ABORT 为 ON 时,
如果执行 Transact-SQL 语句产生运行时错误,
则整个事务将终止并回滚。
默认情况下它是OFF状态。
*/
全部回滚方法2:使用Try...Catch
Use TestDB
Begin Try
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('1','Name1')
Insert Into Person(PersonId,PersonName)
Values('3','Name3')
Commit TransAction
End Try
Begin Catch
Rollback TransAction
End Catch
/*
使用TryCatch来捕获异常。
如果 TRY 块内生成的错误导致当前事务的状态失效,
则将该事务归类为不可提交的事务。
如果通常在 TRY 块外中止事务的错误在 TRY 内发生时,
就会导致事务进入不可提交状态。
不可提交的事务只能执行读操作或 ROLLBACK TRANSACTION。
该事务不能执行任何可能生成写操作或 COMMIT TRANSACTION 的 Transact-SQL 语句。
如果事务被分类为不可提交的事务,则 XACT_STATE 函数会返回值 -1。
*/
全部回滚方法3:自定义错误变量
Use TestDB
Declare @tranError int -- 定义变量
Set @tranError=0
Begin TransAction
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values('','Name1')
Set @tranError = @tranError + @@Error
Insert Into Person(PersonId,PersonName)
Values('','Name3')
Set @tranError = @tranError + @@Error
If @tranError = 0
Commit TransAction
Else
Rollback TransAction
/*
自定义一个变量来判断最后是否发生过错误。
*/
最后要注意的是:如果一个事务写了 Begin TransAction 而没写 Commit TransAction 或 Rollback TransAction 则相关操作的数据(也许是表,也许是列,这我还没测试。。。)会被锁住。。。而对于锁住的解决办法就是单独执行一下Commit TransAction 或 Rollback TransAction
SQL Server 中的回滚的更多相关文章
- SQL 存储过程中事务回滚
		
在事务语句最前面加上 set xact_abort on GO SET QUOTED_IDENTIFIER OFF GO ALTER PROCEDURE [dbo].[test] @a int, @b ...
 - Microsoft SQL Server中的事务与并发详解
		
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
 - 再谈SQL Server中日志的的作用
		
简介 之前我已经写了一个关于SQL Server日志的简单系列文章.本篇文章会进一步挖掘日志背后的一些概念,原理以及作用.如果您没有看过我之前的文章,请参阅: 浅谈SQL Server ...
 - SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因
		
原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中 ...
 - SQL Server中的事务与锁
		
了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂,不能保证数据的安全正确读写. 死锁: ...
 - SQL Server中的事物
		
1.事务的四个属性 原子性Atomicity,一致性Consistency,隔离性Isolation,持久性Durability ,即ACID特性. 原子性:事务必须是一个完整工作的单元,要么全部执行 ...
 - SQL Server中事务、锁定和阻塞
		
事务是什么 在SQL Server中事务是构成一个工作逻辑单元的一系列任务,也就说多个任务放在一起执行,这些任务要么全部执行成功,要么全部执行失败. 通过事务我们可以保证数据的完整性,例如:用户A给用 ...
 - 【转】SQL Server中的事务与锁
		
SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器. 锁:多用户访问同一数据库资源时,对访问的先后次序权限管理的一种机制,没有他事务或许将会一塌糊涂 ...
 - 深入浅出SQL Server中的死锁
		
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
 
随机推荐
- ffmpeg 处理视频项目中用到的一些命令
			
多媒体视频处理工具FFmpeg有非常强大的功能包括视频采集功能.视频格式转换.视频抓图.给视频加水印等. 目前仅接触到了一些初级命令,今天进行了简单整理. 分辨率 //智能1:1缩放 -i : -vf ...
 - 在Android Studio添加本地aar包引用
			
1.如何在Android Studio添加本地aar包引用 https://jingyan.baidu.com/article/2a13832890d08f074a134ff0.html 2.完成上述 ...
 - 分布式协调服务ZooKeeper的典型应用
			
Zookeeper典型应用 参考官方文档: http://zookeeper.apache.org/doc/current/recipes.html Out of the Box Applicatio ...
 - Python爬取网易云歌单
			
目录 1. 关键点 2. 效果图 3. 源代码 1. 关键点 使用单线程爬取,未登录,爬取网易云歌单主要有三个关键点: url为https://music.163.com/discover/playl ...
 - Spring Boot + Spring Cloud 实现权限管理系统 后端篇(十八):注册中心(Spring Cloud Consul)
			
什么是 Consul Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其它分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与 ...
 - SpringBoot2.0源码分析(一):SpringBoot简单分析
			
SpringBoot2.0简单介绍:SpringBoot2.0应用(一):SpringBoot2.0简单介绍 本系列将从源码角度谈谈SpringBoot2.0. 先来看一个简单的例子 @SpringB ...
 - MAC ACL、RACL和VACL
			
拓扑结构: 配置IP地址.VLAN及路由: SW1(config)#int range f0/1 - 2SW1(config-if-range)#switchport mode accessSW1(c ...
 - SpringMVC4返回json
			
前言 目前前后端分离后,接口大多数返回给前端的都是json数据,那么我尝试用SpringMVC4的Controller返回json.demo过程中遇到了几个问题写出来和java初学者分享一下. 开发环 ...
 - MVC EF 执行SQL语句(转载)
			
MVC EF 执行SQL语句 最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 闲着没事,看了一篇关于LI ...
 - C Looooops(poj2115+扩展欧几里德)
			
C Looooops Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Pr ...