SQL SERVER 事务相关
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 事务相关的更多相关文章
- 人人都是 DBA(VI)SQL Server 事务日志
SQL Server 的数据库引擎通过事务服务(Transaction Services)提供事务的 ACID 属性支持.ACID 属性包括: 原子性(Atomicity) 一致性(Consisten ...
- SQL Server 事务复制爬坑记
SQL Server 复制功能折腾了好几天了,现特将其配置过程以及其间遇到的问题记录下来,以备日后查阅.同时,也让“同道”同学们少走不必要的弯路.如果有不对之处,欢迎大家指正,欢迎沟通交流. 一.复制 ...
- 为什么说JAVA中要慎重使用继承 C# 语言历史版本特性(C# 1.0到C# 8.0汇总) SQL Server事务 事务日志 SQL Server 锁详解 软件架构之 23种设计模式 Oracle与Sqlserver:Order by NULL值介绍 asp.net MVC漏油配置总结
为什么说JAVA中要慎重使用继承 这篇文章的主题并非鼓励不使用继承,而是仅从使用继承带来的问题出发,讨论继承机制不太好的地方,从而在使用时慎重选择,避开可能遇到的坑. JAVA中使用到继承就会有两 ...
- 网络异常与SQL Server事务
SQL Server事务遭遇网络异常时的处理机制浅析 SQL Server数据库中,如果应用程序正在执行一个事务的时候突然遭遇了网络异常,例如网络掉包,网络中断等,那么这个事务会怎么样? SQL Se ...
- SQL Server事务的隔离级别
SQL Server事务的隔离级别 ########## 数据库中数据的一致性 ########## 针对并发事务出现的数据不一致性,提出了4个级别的解决方法: 隔离级别 第一类丢失更新 脏读 ...
- Sql Server 事务隔离级别的查看及更改
根据自身 Sql Server 的情况来自定义 事务隔离级别,将会更加的满足需求,或提升性能.例如,对于逻辑简单的 Sql Server,完全可以使用 read uncommitted 模式,来减少死 ...
- SQL Server 日期相关
原文:SQL Server 日期相关 原帖出处:http://blog.csdn.net/dba_huangzj/article/details/7657979 对于开发人员来说,日期处理或许简单,或 ...
- 【SqlServer系列】浅谈SQL Server事务与锁(上篇)
一 概述 在数据库方面,对于非DBA的程序员来说,事务与锁是一大难点,针对该难点,本篇文章视图采用图文的方式来与大家一起探讨. “浅谈SQL Server 事务与锁”这个专题共分两篇,上篇主讲事务及 ...
- SQL SERVER 事务的使用(tran)
sql server事务的使用是为了确保数据的一致性. 通常写法 begin tran --sql 语句1 --sql 语句2 --sql 语句3 commit tran 上面写法存在隐患,当操作(增 ...
随机推荐
- MySQL--线程池(Thread Pool)
================================================================= 线程池技术 在MySQL社区版中,MySQL使用one-thread ...
- HappytimeOnvif Client V8.3的使用
1.system-->system settings-->勾选RTP RTSP 2.start video poll
- day 30 1.操作系统原理 2. Process 模块学习
进程: 起源:进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都是围绕进程的概念展开的.所以想要真正了解进程,必须事先了解操作 ...
- spring boot 项目 热启动
第一需要 spring-boot-devtools 依赖 <dependency> <groupId>org.springframework.boot</groupId& ...
- A* search算法
今天,还是国庆和中秋双节的时间节点,一个天气不错的日子,孩子已经早早的睡觉了,玩了一整天,也不睡觉,累的实在扛不住了,勉强洗澡结束,倒床即睡着的节奏... 不多说题外话,进入正题. 什么是A*搜索算法 ...
- 100M双绞线接头的标准接法
双绞线接头(RJ45)针脚号码定义
- Azure ARM (18) 将Azure RM Manage Disk托管磁盘的Image,跨订阅迁移
<Windows Azure Platform 系列文章目录> 先挖一个坑,以后再埋. 最近遇到一个客户需求,客户使用了Azure RM Manage Disk托管磁盘,然后捕获镜像做成了 ...
- 为什么.net 4.6.1装了却没看到
今天在做SignalR网站,需要在发布到的云服务器安装.net4.6.1 从网上下载了安装包,安装完之后,到Windows文件夹的 Microsoft.NET文件夹中却找不到4.6.1的文件夹. 云服 ...
- <亲测>.NET Core项目在Linux上使用QRCoder时出错"Unable to load DLL 'gdiplus'"
Centos 7 解决方案如下: yum install libgdiplus-devel
- PHP $a='abcdef';请取出$a的值并打印第一个字母
echo $a[0];echo $a{0};echo chr(ord($a));echo substr( $a, 0,1);