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数据库中在存储过程中编写正确的事务处理代码的方法就介绍到这里了,希望本次的介绍能够对您有所帮助。
原文出处:http://www.sqlstudy.com/sql_article.php?id=2008060701。
相关推荐
在存储过程中编写正确的事务处理代码(SQL_Server_2000_
主要介绍了SQL Server存储过程中编写事务处理的方法,结合实例形式总结分析了三种存储过程中编写事务处理的方法,具有一定参考借鉴价值,需要的朋友可以参考下
对游标 函数 T-SQL语言 事务以及存储过程,都有详尽的介绍
SQL和CLR用户自定义函数、存储过程、触发器、事务和新的错误处理结构、应用并发模型支持并发用户、使用Service Broker来控制数据库应用程序中的异步处理等。 内容简介 本书是Inside Microsoft SQL Server 2005系列...
SQl SERVER 进阶 学习课件 ...编写和使用存储过程,在数据库中实现高性能数据管理。 编写和使用触发器,根据业务规则,实现复杂的数据完整行约束。 学习使用事务处理,使用游标获取查询结果。 数据库的各项安全性设置。
第9章 SQLServer存储和索引结构 9.1 SQLServer存储机制 9.1.1 数据库 9.1.2 区段 9.1.3 页 9.1.4 行 9.1.5 稀疏列 9.2 理解索引 9.2.1 平衡树(B.树) 9.2.2 SQLServer中访问数据的方式 9.3 创建、修改和删除索引 ...
◆存储过程的高级处理方法 ◆报表服务和集成服务的用法 ◆提高数据库安全性的提示信息 ◆如何利用XML和XQuery支持 ◆通过修改特定数据值进行推理分析的步骤 读者对象 本书面向想要学用所有SQL Server ...
winxp+delphi7+kbmmw+unidac+mssql2000+dbgrideh ...修改单元kbmMWUNIDAC.pas,本人在数据库中很少用到blob字段,所以在代码里屏蔽掉blob字段的处理, 经测试数据库表字段类型为Text时,程序可以正常处理
7.2.1 在SQL Server Management Studio中查看数据库的信息 7.2.2 使用T-SQL查看数据库信息 7.2.3 检查系统和示例数据库 7.2.4 检查数据库对象 7.3 创建数据库 7.3.1 在SQL Server Management Studio中创建数据库 ...
7.2.1 在SQL Server Management Studio中查看数据库的信息 7.2.2 使用T-SQL查看数据库信息 7.2.3 检查系统和示例数据库 7.2.4 检查数据库对象 7.3 创建数据库 7.3.1 在SQL Server Management Studio中创建数据库 ...
7.2.1 在SQL Server Management Studio中查看数据库的信息 7.2.2 使用T-SQL查看数据库信息 7.2.3 检查系统和示例数据库 7.2.4 检查数据库对象 7.3 创建数据库 7.3.1 在SQL Server Management Studio中创建数据库 ...
◆存储过程的高级处理方法 ◆报表服务和集成服务的用法 ◆提高数据库安全性的提示信息 ◆如何利用XML和XQuery支持 ◆通过修改特定数据值进行推理分析的步骤 读者对象 本书面向想要学用所有SQL Server ...
然而,在SQL Server 2005中,我们可以用.NET家族的语言——主要是VB.NET和C#来编写存储过程(以及方法、触发器和其它组件)。让我们来熟悉一下关于编写存储过程新方法的5个常见问题。它们是非常值得我们探讨的。 1、...
第9章 SQLServer存储和索引结构 9.1 SQLServer存储机制 9.1.1 数据库 9.1.2 区段 9.1.3 页 9.1.4 行 9.1.5 稀疏列 9.2 理解索引 9.2.1 平衡树(B.树) 9.2.2 SQLServer中访问数据的方式 9.3 创建、修改和删除索引 ...
第9章 SQLServer存储和索引结构 9.1 SQLServer存储机制 9.1.1 数据库 9.1.2 区段 9.1.3 页 9.1.4 行 9.1.5 稀疏列 9.2 理解索引 9.2.1 平衡树(B.树) 9.2.2 SQLServer中访问数据的方式 9.3 创建、修改和删除索引 ...
利用Microsoft SQL Server 2008实现灵活的商业智能解决方案使用Microsoft 完善的BI工具构建B0解决方案的必备指南,使用SQLServer 2008设计、开发和部署更有效的数据集成、报表、分析解决方案所需的权威操作指南。...
7.2.1 在SQL Server Management Studio中查看数据库的信息 161 7.2.2 使用T-SQL查看数据库信息 163 7.2.3 检查系统和示例数据库 164 7.2.4 检查数据库对象 164 7.3 创建数据库 166 7.3.1 在SQL Server ...
7.2.1 在SQL Server Management Studio中查看数据库的信息 161 7.2.2 使用T-SQL查看数据库信息 163 7.2.3 检查系统和示例数据库 164 7.2.4 检查数据库对象 164 7.3 创建数据库 166 7.3.1 在SQL Server ...
所以特地用vb.net写了一个仅支持SQLServer的SQLHelper类以方便使用,没做修改直接上传,需要的童鞋欢迎下载,稍做修改即可适用于其他数据库:支持查询数据类命令和修改数据类命令,支持存储过程调用,支持参数化查询...