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中的死锁,更好的方式是通过类比从更大的面理 ...
随机推荐
- Datatable数据转换成excel导出时 数值类型在EXCEL中为文本形式 无法进行统计
功能背景 有地税上以及各企业的一个缴费情况的比对,基于两表进行匹配查看数据是否在合理范围内,对比对完成表进行数值导出. 2.问题描述 匹配和生成匹配结果导出已成功完成,但是在数值列导出后变成了文本形式 ...
- 阿里架构师的工作总结:Spring Cloud在架构演进中起到的作用
Spring Cloud作为一套微服务治理的框架,几乎考虑到了微服务治理的方方面面,本篇主要解答这两个问题:Spring Cloud在微服务的架构中都做了哪些事情?Spring Cloud提供的这些功 ...
- 与LINQ有关的语言特性
在说LINQ之前必须先说说几个重要的C#语言特性 一:与LINQ有关的语言特性 1.隐式类型 (1)源起 在隐式类型出现之前, 我们在声明一个变量的时候, 总是要为一个变量指定他的类型 甚至在fore ...
- Angular学习第一步
前端开发越来越流行了,作为后端开发人员,也开始需要学习前端了.随着前端技术的发展,前端技术也越来越复杂,复杂程度不亚于后端,各种框架各种设计模式前端都用上了,什么AngularJS,Angular, ...
- 内核开发知识第二讲,编写Kerner 程序中注意的问题.
一丶函数多线程的安全问题 什么是函数多线程安全. 简单来说就是 ,一个函数在调用过程中.还没有返回的时候.再次被其他线程调用了.但是函数执行的结果是可靠的.就可以了说这个函数是安全的. 比如我们在用户 ...
- ContextLoaderListener可以不写嘛?
写了那么久的Spring,经常写这样的配置,这就是几行Spring.SpringMvc的基本配置, 但是最近也看到不写最前面的context-param以及listener的,好奇记录下. <c ...
- [转]在Node.js中使用RabbitMQ系列一 Hello world
本文转自:https://www.cnblogs.com/cpselvis/p/6288330.html 在前一篇文章中可伸缩架构简短系列中提到过关于异步的问题.当时推荐使用RabbitMQ来做任务队 ...
- [转]How to Improve Entity Framework Add Performance?
本文转自:http://entityframework.net/improve-ef-add-performance When you overuse the Add() method for mul ...
- 前端迷思与React.js
前端迷思与React.js 前端技术这几年蓬勃发展, 这是当时某几个项目需要做前端技术选型时, 相关资料整理, 部分评论引用自社区. 开始吧: 目前, Web 开发技术框架选型为两种的占 80% .这 ...
- scala简单入门_wordCount
scala的语法写起来是非常的舒服的,相比java来说,简便许多.而Java在scala面前就显的略微有些笨重了. 接下来我们看一下scala版的wordcount import scala.io.S ...