sql server存储过程详解(SQL Server存储过程中编写事务处理的方法小结)
类别:数据库 浏览量:883
时间:2022-04-04 13:43:42 sql server存储过程详解
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数据库程序设计有所帮助。
您可能感兴趣
- docker如何搭建mysql(docker容器访问宿主机的MySQL操作)
- mysqlselect语句汇总(MySQL Select语句是如何执行的)
- sqlserver分区查询语句(SQL Server中的集合运算: UNION, EXCEPT和INTERSECT示例代码详解)
- mysql新增字段并添加备注(mysql添加备注信息的实现)
- mysqlexplain的用法(MySQL SHOW STATUS语句的使用)
- mysql 双主双备(MySQL配置了双主,是如何避免出现数据回环冲突的)
- mysql 索引使用总结(MySQL复合索引的深入探究)
- mysql 如何选择隔离级别(全面解析MySQL中的隔离级别)
- sql server操作方法(SQL Server 文件操作方法)
- sqlserver游标使用场景(解析SQL Server聚焦移除Bookmark Lookup、RID Lookup、Key Lookup)
- mysql事务特性和隔离级别(Mysql事务特性和级别原理解析)
- mysql获取随机数(MySQL 生成随机数字、字符串、日期、验证码及 UUID的方法)
- mysql5.7.36详细安装(CenOS6.7下mysql 8.0.22 安装配置方法图文教程)
- binlog怎么恢复mysql数据库(mysql5.7使用binlog 恢复数据的方法)
- SQL语句中单引号
- SQL中的运算符
- 这8种耐阴植物,营造阴生植物花境,也是一个不错的选择(营造阴生植物花境)
- 览邦G08 Plus SMART WATCH 测评⑱ 全独立这才是智能手表该有的样子(览邦G08PlusSMART)
- 荣耀手表 GS 3 真机亮相 不支持无线充电(荣耀手表GS3)
- 通过体温就能为智能手表充电 原来是用NASA在空间站用的黑科技(通过体温就能为智能手表充电)
- 智能手表兼容Windows和Android 无需充电挑战苹果(智能手表兼容Windows和Android)
- 一天一冲也算表 麦步,一款待机 21 天的智能手表体验评测(一天一冲也算表)
热门推荐
- 用python编写一个gui(用 Python 构建漂亮的 GUI)
- javascript类型转换讲解(JavaScript数据类型转换详解推荐)
- tomcat优化jvm(Tomcat修正JDK原生线程池bug的实现原理)
- 工作如何分轻重缓急
- memcache安装与调优部署文件(Memcached构建缓存服务器的方法)
- 用python画圣诞树送给女朋友(情人节快乐! python绘制漂亮玫瑰花)
- 怎么写存储过程sql server(SqlServer存储过程实现及拼接sql的注意点)
- vmware 安装失败(安装使用Vmware出现的问题及解决方法)
- pythonyield有什么用(彻底理解Python中的yield关键字)
- 使用 iosOverlay 弹出提示信息