SQL Server中数据库事务处理是相当有用的,鉴于很多SQL初学者编写的事务处理代码存往往存在漏洞,本文我们介绍了三种不同的方法,举例说明了如何在存储过程事务处理中编写正确的代码。希望能够对您有所帮助。

在编写SQL Server 事务相关的存储过程代码时,经常看到下面这样的写法:

begin tran   
   update statement 1 ...   
   update statement 2 ...   
   delete statement 3 ...   
commit tran 

这样编写的SQL存在很大隐患。请看下面的例子:

IF OBJECT_ID(N'demo',N'U') IS NOT NULL
DROP TABLE demo
create table demo(id int not null)   
go   
begin tran   
   insert into demo values (null)  
   insert into demo values (2)   
commit tran   
go 

执行时会出现一个违反not null 约束的错误信息,但随后又提示(1 row(s) affected)。 我们执行select * from demo 
后发现insert into demo values(2) 却执行成功了。 这是什么原因呢? 原来 SQL Server在发生runtime 
错误时,默认会rollback引起错误的语句,而继续执行后续语句。

如何避免这样的问题呢?

有三种方法:

1. 在事务语句最前面加上set xact_abort on

set xact_abort on   
begin tran   
   update statement 1 ...   
   update statement 2 ...   
   delete statement 3 ...   
commit tran   
go 

当xact_abort 选项为on 时,SQL Server在遇到错误时会终止执行并rollback 整个事务。

2. 在每个单独的DML语句执行后,立即判断执行状态,并做相应处理。

begin tran   
   update statement 1 ...  
   if @@error <> 0   
      begin rollback tran   
      goto labend   
   end   
   delete statement 2 ...   
   if @@error <> 0  
      begin rollback tran   
      goto labend   
   end   
   commit tran   
   labend:   
go 

3. 在SQL Server 2005中,可利用 try...catch 异常处理机制。

begin tran   
begin try   
   update statement 1 ...   
   delete statement 2 ...   
end try   
begin catch  
   if @@trancount > 0   
      rollback tran   
end catch  
   if @@trancount > 0   
      commit tran  
go 

关于SQL Server数据库中在存储过程中编写正确的事务处理代码的方法就介绍到这里了,希望本次的介绍能够对您有所帮助。

原文出处:http://www.cnblogs.com/linyechengwei/archive/2011/10/09/2203898.html

SQL Server在存储过程中编写事务处理代码的三种方法的更多相关文章

  1. ZH奶酪:PHP中添加HTML代码的三种方法

    php中添加HTML代码,就是php类型的文件中添加html代码~ 第一种是在HTML中加PHP. 大段大段的html代码中,在各个需要执行php的地方<?php .... ?> 比如 l ...

  2. YbSoftwareFactory 代码生成插件【二十五】:Razor视图中以全局方式调用后台方法输出页面代码的三种方法

    上一篇介绍了 MVC中实现动态自定义路由 的实现,本篇将介绍Razor视图中以全局方式调用后台方法输出页面代码的三种方法. 框架最新的升级实现了一个页面部件功能,其实就是通过后台方法查询数据库内容,把 ...

  3. Eclipse远程调试Java代码的三种方法

    Eclipse远程调试Java代码的三种方法, 第1种方法是用来调试已经启动的Java程序,Eclipse可以随时连接到远程Java程序进行调试, 第2种方法可以调试Java程序启动过程,但是Ecli ...

  4. Java中获取键盘输入值的三种方法

    Java中获取键盘输入值的三种方法     Java程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值 ...

  5. 【转载】取得系统中网卡MAC地址的三种方法

    From:http://blog.csdn.net/zhangting1987/article/details/2732135 网卡地址这个概念有点混淆不清.因为实际上有两个地址,mac地址和物理地址 ...

  6. HOSt ip is not allowed to connect to this MySql server, MYSQL添加远程用户或允许远程访问三种方法

    HOSt ip is not allowed to connect to this MySql server 报错:1130-host ... is not allowed to connect to ...

  7. Java中实现线程同步的三种方法

    实现同步的三种方法 多线程共享数据时,会发生线程不安全的情况,多线程共享数据必须同步. 实现同步的三种方法: 使用同步代码块 使用同步方法 使用互斥锁ReetrantLock(更灵活的代码控制) 代码 ...

  8. SQL Server数据库存储过程中拼接字符串注意的问题

    在SQL Server数据库中书写复杂的存储过程时,一般的做法是拼接字符串,最后使用EXEC sp_executesql '拼接的字符串' 查询出结果. 先看一段代码: -- ============ ...

  9. 在 SQL Server 的存储过程中调用 Web 服务

    介绍 一个老朋友计划开发一个应用,基于 .NET 和 Socket,但需要在存储过程中调用 Web 服务. 在这篇文章中我们将分享这个应用的经验,讲述如何在存储过程中调用 Web 服务,并传递参数. ...

随机推荐

  1. python_plot画图参数设置

    # coding:utf-8 import pandas as pd import numpy as np import matplotlib.pyplot as plt # one_hot数据的读取 ...

  2. linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH)

    linux 环境变量设置方法总结(PATH/LD_LIBRARY_PATH) http://blog.csdn.net/wangeen/article/details/8159500 设置 Linux ...

  3. elasticSearch script api

    Package org.elasticsearch.script Support for running user provided scripts (in the request, in clust ...

  4. 区块链开发(六)truffle使用入门和testrpc安装

    在上篇博文中我们已经成功安装了truffle及所需相关环境,此篇就简单介绍一些truffle的使用及目录结构等. 简介truffle和testrpc truffle是本地的用来编译.部署智能合约的工具 ...

  5. selenium java 读取xml (数据驱动)

    selenium 数据驱动 (xml解析) getElementByTagName()可以通过标签名获取某个标签.它所获取的对象是以数组形式存放.如“caption”和“item”标签在info.xm ...

  6. 安装配置GitLab

    在 CentOS 6 安装 使用国内镜像安装,新建 /etc/yum.repos.d/gitlab-ce.repo,添加以下内容 [gitlab-ce] name=gitlab-ce baseurl= ...

  7. 打印sql语句方法

    var_dump($this->blackpool_model->getLastSql());

  8. selenium 难定位元素,时间插件,下拉框定位,string包含,定位列表中的一个,技巧

    关于frame: 如果网页存在iframe的话,传统的定位有时候找不到元素,需要切换frame: # 切换到leftFrame定位“测井设计” driver.switch_to_frame(" ...

  9. CF 990C. Bracket Sequences Concatenation Problem【栈/括号匹配】

    [链接]:CF [题意]: 给出n个字符串,保证只包含'('和')',求从中取2个字符串链接后形成正确的括号序列的方案数(每个串都可以重复使用)(像'()()'和'(())'这样的都是合法的,像')( ...

  10. Python与数据结构[3] -> 树/Tree[1] -> 表达式树和查找树的 Python 实现

    表达式树和查找树的 Python 实现 目录 二叉表达式树 二叉查找树 1 二叉表达式树 表达式树是二叉树的一种应用,其树叶是常数或变量,而节点为操作符,构建表达式树的过程与后缀表达式的计算类似,只不 ...