1 准备数据 及 涉及到的几个设置

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED  --设置事务会话的隔离等级(默认值为 READ UNCOMMITTED ),只对当前进程有效(就是说只对打开SSMS当前查询窗口有效,再打开另一个查询窗口就无效了)

SET XACT_ABORT OFF  --设置精确终止(暂且这么叫)开关(默认值为 OFF)   ,只对当前进程有效(就是说只对打开SSMS当前窗口有效,再打开另一个就无效了)

查看 XACT_ABORT 是否启用

SELECT (CASE WHEN (16384 & @@OPTIONS) = 16384 THEN 'ON' ELSE 'OFF' END) AS XACT_ABORT;  
IF NOT OBJECT_ID('Score') IS NULL
DROP TABLE [Score]
GO
IF NOT OBJECT_ID('Student') IS NULL
DROP TABLE [Student]
GO CREATE TABLE Student
(stuid int NOT NULL PRIMARY KEY,
stuName Nvarchar(20)
)
CREATE TABLE Score
(stuid int NOT NULL REFERENCES Student(stuid),--外键
scoreValue int
)
GO INSERT INTO Student VALUES (101,'胡一刀')
INSERT INTO Student VALUES (102,'袁承志')
INSERT INTO Student VALUES (103,'陈家洛')
INSERT INTO student VALUES (104,'张三丰')
GO

2 回滚事例

--最简单回滚
--下面语句可以分开执行,一次执行一行 BEGIN TRAN --开启事务,设置事务开始点
/*
命令已成功完成。
*/ SELECT * FROM score
/*
(0 行受影响)
说明:因为表里没有数据,所以查询返回条数为0.
*/ INSERT INTO score VALUES (101, 59) --插入数据,此时如果查看消息:(1 行受影响)
/*
(1 行受影响)
*/ SELECT * FROM score
/*
stuid scoreValue
101 59 (1 行受影响)
说明:本进程内(本查询窗口)可以查到此条已经插入的数据,但是其它进程(查询窗口)是无法查到数据的。因为现在事务并没有提交,SQLSERVER 的默认隔离级别为 READ COMMITTED ,此隔离级别在其它进行中是无法读取到未提交数据的。 */ ROLLBACK
/*
命令已成功完成。
说明:回滚未提交事务。
*/ SELECT * FROM score
/*
(0 行受影响)
因为已经回滚了,所以查不出数据了。
*/
--常见回滚
--情景1
BEGIN TRAN --开启事务,设置事务开始点 INSERT INTO score VALUES(101,999) --此记录可以插入
INSERT INTO score VALUES(109,999) --无法插入该数据,因为外键约束,所以查询分析器会报错出来
INSERT INTO score VALUES(102,888) --此记录可以插入
COMMIT TRAN; SELECT * FROM score /*
stuid scoreValue
101 999
102 888
说明:这里会查询到两行数据,也就是说出错的那条记录没有进数据库,但是同时SQL任务并没有停止运行,而是把剩余的所有语句都运行了,直至任务完结。
其实这并不是我们所期望的,我们期望的是,如果此三条数据有问题,则全部不插入数据库。
*/ --情景2
BEGIN TRY
BEGIN TRAN; --开启事务,设置事务开始点
INSERT INTO score VALUES(101, 999); --此记录可以插入
INSERT INTO score VALUES(109, 999); --无法插入该数据,因为外键约束,所以查询分析器会报错出来
INSERT INTO score VALUES(102, 888); --此记录可以插入
COMMIT TRAN;
END TRY
BEGIN CATCH
BEGIN
ROLLBACK;
END;
END CATCH; SELECT * FROM score
/*
(0 行受影响)
说明:try 获取到了事务中的错误,所以进行了回滚。这时就是对整个事务的回滚了,所以没有数据插入到数据库。
这是我们所希望看到的,如果3条语句中有一句有错误,则全部不提交
*/ --情景3 SET XACT_ABORT ON; BEGIN TRAN; --开启事务,设置事务开始点
INSERT INTO score VALUES(101, 999); --此记录可以插入
INSERT INTO score VALUES(109, 999); --无法插入该数据,因为外键约束,所以查询分析器会报错出来
INSERT INTO score VALUES(102, 888); --此记录可以插入
COMMIT TRAN; SELECT * FROM score /*
(0 行受影响)
说明:XACT_ABORT 设置为ON 时,这时就是对整个事务的回滚了,所以没有数据插入到数据库。
这是我们所希望看到的,如果3条语句中有一句有错误,则全部不提交。
SET XACT_ABORT ON; 只对当前进程有效(当前查询窗口)。
*/

二、捕获错误的常用函数


1、ERROR_NUMBER()  返回错误号。


2、ERROR_SEVERITY()  返回严重级别。


3、ERROR_STATE()  返回错误状态号。


4、ERROR_PROCEDURE()  返回出现错误的存储过程或触发器的名称。


5、ERROR_LINE()  返回导致错误的行号。


6、ERROR_MESSAGE()  返回错误消息的完整文本。该文本可包括任何可替换参数所提供的值,如长度、对象名或时间。

 

 综上所以如果想让整个语句块,多条语句要么全部提交,要么全部不提交的方法为 情景2 和 情景3 中所描述。

SQL SERVER 事务相关的更多相关文章

  1. 人人都是 DBA(VI)SQL Server 事务日志

    SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...

  2. SQL Server 事务复制爬坑记

    SQL Server 复制功能折腾了好几天了,现特将其配置过程以及其间遇到的问题记录下来,以备日后查阅.同时,也让“同道”同学们少走不必要的弯路.如果有不对之处,欢迎大家指正,欢迎沟通交流. 一.复制 ...

  3. 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结

    为什么说JAVA中要慎重使用继承   这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...

  4. 网络异常与SQL Server事务

    SQL Server事务遭遇网络异常时的处理机制浅析 SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Se ...

  5. SQL Server事务的隔离级别

    SQL Server事务的隔离级别 ########## 数据库中数据的一致性 ########## 针对并发事务出现的数据不一致性,提出了4个级别的解决方法:  隔离级别  第一类丢失更新  脏读 ...

  6. Sql Server 事务隔离级别的查看及更改

    根据自身 Sql Server 的情况来自定义 事务隔离级别,将会更加的满足需求,或提升性能.例如,对于逻辑简单的 Sql Server,完全可以使用 read uncommitted 模式,来减少死 ...

  7. SQL Server 日期相关

    原文:SQL Server 日期相关 原帖出处:http://blog.csdn.net/dba_huangzj/article/details/7657979 对于开发人员来说,日期处理或许简单,或 ...

  8. 【SqlServer系列】浅谈SQL Server事务与锁(上篇)

    一  概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...

  9. SQL SERVER 事务的使用(tran)

    sql server事务的使用是为了确保数据的一致性. 通常写法 begin tran --sql 语句1 --sql 语句2 --sql 语句3 commit tran 上面写法存在隐患,当操作(增 ...

随机推荐

  1. Properties 类的使用

    定义: 表示一个持久的集合,可以存在流中,或者从流中加载.是Hashtable子类,map集合方法都可以用. 方法的使用: /* * 集合对象 properties继承Hashtable实现了Map接 ...

  2. hive array、map、struct使用

    hive提供了复合数据类型:Structs: structs内部的数据可以通过DOT(.)来存取,例如,表中一列c的类型为STRUCT{a INT; b INT},我们可以通过c.a来访问域aMaps ...

  3. How tbb proxy works

  4. [转]MySQL中乐观锁、悲观锁(共享锁、排他锁)简介

    InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB. MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高 ...

  5. SELECT 语句语法

    SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESULT] [SQL_BIG_R ...

  6. koa 学习资料

    koa 学习资料 学习资料 地址 koa 中文版 https://koa.bootcss.com/

  7. python通过xlwt模块直接在网页上生成excel文件并下载

    urls: from django.conf.urls import url, include from . import views urlpatterns = [ ... url(r'^domai ...

  8. Python Scrapy环境配置教程+使用Scrapy爬取李毅吧内容

    Python爬虫框架Scrapy Scrapy框架 1.Scrapy框架安装 直接通过这里安装scrapy会提示报错: error: Microsoft Visual C++ 14.0 is requ ...

  9. 顶级域名和二级域名共享cookie及相互删除cookie

    在CSDN看到一个cookie设置domain时,如何删除的问题, 自己也只知道domain设置为顶级域名时可以被其他二级域名共享,但是如何删除还是有一点搞不清楚,所以特意测试了下cookie和dom ...

  10. 自定义Write节点的afterrender属性

    由于nuke中的write节点提供了beforerender,afterrender这类事件,我们想添加一些功能只需要在这里面敲入代码即可.事件一旦发生,自然会触发我们敲入的co de.   Nuke ...