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 上面写法存在隐患,当操作(增 ...
随机推荐
- 扩大UIButton的选区
设计为了美观.button有时设计的太小,这么一来是好看了.可是button不好点中了.曾经有非常多解决方法,如用hitTest等方法. 都比較复杂.后来我发现一个简单的方法. 原理就是U ...
- Oracle sqlnet.ora配置
Oracle sqlnet.ora配置 sqlnet.ora的作用(官网指出的) www.2cto.com 1.限制客户端访问(如指定客户端域为不允许访问) 2.指定命名方法(local nami ...
- 通过LoadGenerator将Linux作为负载机进行压力测试
前提说明: 测试架构:controller部署在windows操作系统下(windows下安装loadrunner的过程,可以去网上搜下,这里不做解释),loadgenerator部署在linux下. ...
- Mongo 用户创建及权限管理
Mongo版本3.0之前使用的是db.addUser(),但3.0之后使用的是db.createUser() 内建的角色: 数据库用户角色:read.readWrite; 数据库管理角色:dbAdmi ...
- js 递归
我理解的递归就是自己调用自己,也就是函数在调用的时候会形成 call stack 调用堆栈.这些数据是用来函数调用完成后,回复之前的函数环境或者局部变量之类的,一般这个都有大小限制,不可能无限生成函数 ...
- mysql show master status为空值
问题 执行show master status,输出结果为空: mysql> show master status; Empty set (0.00 sec) 原因 mysql没有开启日志. 查 ...
- 中文自然语言处理工具hanlp隐马角色标注详解
本文旨在介绍如何利用HanLP训练分词模型,包括语料格式.语料预处理.训练接口.输出格式等. 目前HanLP内置的训练接口是针对一阶HMM-NGram设计的,另外附带了通用的语料加载工具,可以通过少量 ...
- python条件判断,真假
整形 非0即真 字符串 非空即真 列表,元组,字典,集合为空时 为假 函数 返回值为空(即函数中只写了return后面没参数),为0(即return 0),为空的列表,字典,集合.那么条件判断函数也是 ...
- DLL何时需共享内存管理器
Delphi创建DLL时,IDE自动生成的文档中写得很清楚,当在DLL中以动态数组或String做为参数或返回值时(即RTL自动维护的数据类型),请在每个工程文件的第一个单元加上ShareMem.这样 ...
- MyEclipse+Tomcat配置
一.Tomcat 1 Tomcat概述 Tomcat服务器由Apache提供,开源免费.由于Sun和其他公司参与到了Tomcat的开发中,所以最新的JSP/Servlet规范总是能在Tomcat中体现 ...