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. MySQL--线程池(Thread Pool)

    ================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...

  2. HappytimeOnvif Client V8.3的使用

    1.system-->system settings-->勾选RTP RTSP 2.start video poll

  3. day 30 1.操作系统原理 2. Process 模块学习

    进程: 起源:进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作 ...

  4. spring boot 项目 热启动

    第一需要 spring-boot-devtools 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...

  5. A* search算法

    今天,还是国庆和中秋双节的时间节点,一个天气不错的日子,孩子已经早早的睡觉了,玩了一整天,也不睡觉,累的实在扛不住了,勉强洗澡结束,倒床即睡着的节奏... 不多说题外话,进入正题. 什么是A*搜索算法 ...

  6. 100M双绞线接头的标准接法

     双绞线接头(RJ45)针脚号码定义

  7. Azure ARM (18) 将Azure RM Manage Disk托管磁盘的Image,跨订阅迁移

    <Windows Azure Platform 系列文章目录> 先挖一个坑,以后再埋. 最近遇到一个客户需求,客户使用了Azure RM Manage Disk托管磁盘,然后捕获镜像做成了 ...

  8. 为什么.net 4.6.1装了却没看到

    今天在做SignalR网站,需要在发布到的云服务器安装.net4.6.1 从网上下载了安装包,安装完之后,到Windows文件夹的 Microsoft.NET文件夹中却找不到4.6.1的文件夹. 云服 ...

  9. <亲测>.NET Core项目在Linux上使用QRCoder时出错"Unable to load DLL 'gdiplus'"

    Centos 7 解决方案如下: yum install libgdiplus-devel

  10. PHP $a='abcdef';请取出$a的值并打印第一个字母

    echo $a[0];echo $a{0};echo chr(ord($a));echo substr( $a, 0,1);