SQL Server存储过程中编写事务处理的方法小结

 更新时间:2016年03月08日 11:35:30   作者:lyflcear  
这篇文章主要介绍了SQL Server存储过程中编写事务处理的方法,结合实例形式总结分析了三种存储过程中编写事务处理的方法,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了SQL Server存储过程中编写事务处理的方法。分享给大家供大家参考,具体如下:

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

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

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

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

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 ...
endtry
begin catch
if @@trancount > 0
rollback tran
end catch
if @@trancount > 0
commit tran
go

下面是个简单的存储过程,演示事务处理过程。

create procedure dbo.pr_tran_inproc as begin set nocount on
begin tran
update statement 1 ...
if @@error <> 0
begin rollback tran
return -1 end
delete statement 2 ...
if @@error <> 0
begin rollback tran
return -1
end commit tran
return 0
end
go

希望本文所述对大家SQL Server数据库程序设计有所帮助。

相关文章

  • SQL中NVL()函数的用法

    SQL中NVL()函数的用法

    SQL中的NVL()函数是一个空值转换函数,本文主要介绍了SQL中NVL()函数的用法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • SQL开窗函数的具体实现详解

    SQL开窗函数的具体实现详解

    这篇文章主要介绍了SQL开窗函数的具体实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • sql中<![CDATA[]]>的具体使用详解

    sql中<![CDATA[]]>的具体使用详解

    使用动态SQL时,如果if、foreach、where等标签一但被 <![CDATA[ ]]>标签包裹,本文主要介绍了sql中<![CDATA[]]>的具体使用详解,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • SQL Server2000在win10上安装的方法图文教程

    SQL Server2000在win10上安装的方法图文教程

    Win10本身是一个兼容性较好的操作系统,有很多人在咨询如何在Windows 10上安装SQL Server 2000数据库,都没有成功过,这篇文章主要给大家介绍了关于SQL Server2000在win10上安装的方法,需要的朋友可以参考下
    2024-05-05
  • sql下三种批量插入数据的方法

    sql下三种批量插入数据的方法

    本文将介绍三种批量插入数据的方法,需要的朋友可以参考下
    2013-10-10
  • SQL Server 中的数据类型隐式转换问题

    SQL Server 中的数据类型隐式转换问题

    这篇文章主要介绍了SQL Server 中的数据类型隐式转换问题,本文给大家介绍的非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-08-08
  • sql表连接查询使用方法(sql多表连接查询)

    sql表连接查询使用方法(sql多表连接查询)

    表连接就是通过关联多张表,从而检索出需要的数据的方法,下面我们通过代码示例来学习一下sql的表连接使用方法
    2014-01-01
  • SQL Server 分页编号的另一种方式【推荐】

    SQL Server 分页编号的另一种方式【推荐】

    这篇文章主要介绍了SQL Server 分页编号的另一种方式,需要的朋友可以参考下
    2018-06-06
  • SQL语句的基本语法

    SQL语句的基本语法

    SQL语句的基本语法...
    2006-08-08
  • SQL SERVER性能优化综述(很好的总结,不要错过哦)

    SQL SERVER性能优化综述(很好的总结,不要错过哦)

    一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。
    2008-09-09

最新评论