t-sql中的事务控制及错误处理

------------------------------------------------事务控制-----------------------------------------------------

Sql Server 2005/2008中提供了begin tran,commit tran和rollback tran来使用事务。
begin tran表示开始事务, commit tran表示提交事务,rollback tran表示回滚事务
begin tran 可以理解成新建一个还原点;
commit tran提交这个自begin tran开始的修改;
rollback tran 表示还原到上个还原点。

 

先创建工作表

USE master
CREATE TABLE student
(
stuid INT NOT NULL PRIMARY KEY,
stuname VARCHAR(50)
)
CREATE TABLE score
(
stuid INT NOT NULL REFERENCES student(stuid),
score INT
)

如下示例不太恰当, 但正确使用了事务 

begin tran

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')

INSERT INTO score VALUES (101,190)
INSERT INTO score VALUES (102,78)

if exists(select 1 from score where score>100)--如果有>100分的成绩,则回滚整个事务
rollback
else
commit tran

因为事务里有插入分数为190(>100)的记录, 所以整个事务回滚。

------------------------------------------------错误处理 Error Handling-----------------------------------------------------

对于运行时错误或异常呢?

先准备如下数据:

INSERT INTO student VALUES (101,'zhangsan')
INSERT INTO student VALUES (102,'wangwu')
INSERT INTO student VALUES (103,'lishi')
INSERT INTO student VALUES (104,'maliu')

 

--调用一个运行时错误
SET XACT_ABORT OFF
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外键错误 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN

执行如上sql,出现了运行时错误(外键冲突), 整个事务无法回滚

如果产生异常,则事务是不会回滚的, 此时要借助如下2种方法:

1)SET XACT_ABORT ON
SET XACT_ABORT ON时,在事务中,若出现错误,系统即默认回滚事务,但只对非自定义错误有效

SET XACT_ABORT OFF,默认值,在事务中,回滚一个语句还是整个事务视错误的严重程序而定,用户级错误一般不会回滚整个事务
When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.
The setting of SET XACT_ABORT is set at execute or run time and not at parse(从语法上分析;解析) time.

SET XACT_ABORT ON
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外键错误 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
SET XACT_ABORT OFF

执行后会抛出异常:

消息 547,级别 16,状态 0,第 6 行
INSERT 语句与 FOREIGN KEY 约束"FK__score__stuid__5C37ACAD"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuid'。

2)使用TRY...CATCH构造,并调用一个运行时错误

SET XACT_ABORT OFF
BEGIN TRY
BEGIN TRAN
INSERT INTO score VALUES (101,90)
INSERT INTO score VALUES (102,78)
INSERT INTO score VALUES (107, 76) /* 外键错误 */
INSERT INTO score VALUES (103,81)
INSERT INTO score VALUES (104,65)
COMMIT TRAN
PRINT '事务提交'
END TRY
BEGIN CATCH
ROLLBACK
PRINT '事务回滚'
SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() as ErrorState,
ERROR_MESSAGE() as ErrorMessage;
END CATCH

此时,会print出“事务回滚”, 错误信息为:

ErrorNumberErrorSeverityErrorStateErrorMessage
547160INSERT 语句与 FOREIGN KEY 约束"FK__score__stuid__5C37ACAD"冲突。该冲突发生于数据库"master",表"dbo.student", column 'stuid'。

转载于:https://www.cnblogs.com/buguge/archive/2012/03/08/2385477.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422550.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ADT

ADT:https://dl-ssl.google.com/android/eclipse/ SDK:http://developer.android.com/sdk/index.html转载于:https://www.cnblogs.com/Robbery/archive/2012/03/08/2385892.html

《那些年啊,那些事——一个程序员的奋斗史》——79

旧的4.3'主板是废弃了,新的带CMMB的板子开始了。对于新的板子来说,其实只是在旧的板子上做改动,比如删掉蓝牙模块啊,去掉视频输入啊等;最大的不同,只是根据Telechips的原理图增加CMMB部分而已。…

Win配置Apache+mod_wsgi+django环境+域名

转自:http://liluo.org/2010/05/win-apache-mod_wsgi-django-domain/ Python是落落的最爱,Django是Python web framework中的佼佼者,所以一直超爱。当然,Python web server也有N多选择,这里落落使用Apachemod_wsgi来配…

screen执行php,Linux中screen命令及使用方法

Screen简介Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。GUN Screen&am…

CSS的历史与工作原理

1. 浏览器的发展与CSS网页浏览器主要通过HTTP协议连接网页服务器而取得网页,HTTP容许网页浏览器送交资料到网页服务器并且获取网页。目前最常用的 HTTP 是 HTTP/1.1,这个协议在RFC2616中被完整定义。HTTP/1.1 有其一套Internet Explorer并不完全支援的标…

java类可选,java – 是否有类可选,但非可选的类?

它是方便的声明函数映射值和消费它们,如果它们存在。在你有几个强制对象和几个可选的情况下,我发现自己包装在Optional.of(mandatoryObject)中的其他人,所以我可以使用相同的表达式,而不必向后写。Food vegetables Food.someVege…

数据库字符串处理函数

在数据库操作中,经常要进行字符串的拼接和替换等操作。下面总结归纳如下: 示例数据表people如下: 1 sql server数据库中的sql语句可以直接用 号进行字符串的拼接。举例如下: select Name ‘ ’ gentle as message from people …

[zz]Apache Thrift学习小记

参考: http://incubator.apache.org/thrift/ http://wiki.apache.org/thrift/FrontPage http://jnb.ociweb.com/jnb/jnbJun2009.html非常好的入门教程 http://developers.facebook.com/thrift/thrift-20070401.pdfthrift开发者写的论文 http://wiki.apache.org/thri…

php引用python出现502,【已解决】python执行出错:HTTPError: HTTP Error 502: Bad Gateway

【已解决】python执行出错:HTTPError: HTTP Error 502: Bad Gateway【背景】某此脚本执行,出现错误:LINE 1687 : ERROR Unknown Error !Traceback (most recent call last):File “E:WebServerWordPressto_wphi-baidu-mover_v2hi-baidu-mo…

can't load apple.laf.AquaLookAndFeel (Ant in Eclipse can't find it

转载自:http://lists.apple.com/archives/java-dev/2004/Oct/msg00529.html Re: "cant load apple.laf.AquaLookAndFeel" (Ant in Eclipse cant find it) Subject: Re: "cant load apple.laf.AquaLookAndFeel" (Ant in Eclipse cant find it)Fr…

php中的会话控制器,php – codeigniter检查每个控制器中的用户会话

另一个选项是创建基本控制器。将函数放在基本控制器中,然后继承。要在CodeIgniter中实现这一点,请在应用程序的libraries文件夹中创建一个名为MY_Controller.php的文件。class MY_Controller extends Controller{public function __construct(){parent::…

EXT.NET高效开发(一)——概述

之前就有想法说说这方面,直到看到我上一篇博客《EXT.NET复杂布局(一)——工作台》的回复: 小龙3:ext.net 比使用傳統的webform控件开发时间多多少? 我就决定提前写这一系列了。小龙3应该感到荣幸。嘿嘿。 相…

php 类的注释标准,php标准注释

文件头部模板/***这是一个什么文件**此文件程序用来做什么的(详细说明,可选。)。* author richard* version $Id$* since 1.0*/函数头部注释/*** some_func* 函数的含义说明** access public* param mixed $arg1 参数一的说明* param mixed $arg2 参数二的说明* par…

前端学习(417):京东制作页面25中间部分的准备工作

引入index.css作为中部样式 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Comp…

前端学习(418):京东制作页面26中间模块划分

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-left:10px;} .grid-coll3{width: 190px;height: 100%;background-color:purple;…

Linux下,安装配置Weblogic

Linux下&#xff0c;安装配置Weblogic2009-03-20 15:03一、安装配置JDK //如果应用不需要高版本的JDK的话&#xff0c;可以不单独安装JDK 1. 安装JDK # chmod ax jdk-1_5_0_15-linux-i586.bin # ./jdk-1_5_0_15-linux-i586.bin # mv jdk1.5.0_15 /usr/local/jdk //JDK安…

php_self nginx,nginx中的PATH_INFO为什么会影响$_SERVIER['PHP_SELF']

发现问题&#xff1a;使用ThinkPHP3.2.2在nginx部署网站&#xff0c;设置URL_MODEL2&#xff0c;使用U方法在本地生成的链接形如:/public/index但是在部署在nginx上却出现了问题 其中的URL生成了./public/index通过追寻ThinkPHP源码在ThinkPHP.php文件中发现了如下代码:if(IS_C…

前端学习(419):京东制作页面27左侧分类上

index.css /* 中间模块 */ .grid{height: 480px;} .grid-coll1{width: 190px;height: 100%;background-color: pink;} .grid-coll1 ul{padding: 20px 0;} .grid-coll1 ul li{padding-left: 12px;}.grid-coll2{width: 790px;height: 100%;background-color: skyblue;margin-lef…

java 树结构递归设计,java实现递归树形结构

数据结构递归树,数据结构递归算法,数据结构递归,数据结构递归运算,考研数据结构考递归,数据结构递归回溯,js递归树形数据结构,数据结构分治,递归变非递归用什么数据结构......通过函数递归调用来实现树形结构数据遍历的方法,其中递归函数体实现了打印指定结点的子结点功能。本方…

解析IP地址与MAC地址

一、IP地址  对于IP地址&#xff0c;相信大家都很熟悉&#xff0c;即指使用TCP/IP协议指定给主机的32位地址。IP地址由用点分隔开的4个8八位组构成&#xff0c;如192.168.0.1就是一个IP地址&#xff0c;这种写法叫点分十进制格式。IP地址由网络地址和主机地址两部分组成&…