网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > SQL技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
本月文章推荐
.使用人工智能技术自动对SQL语句进.
.教你轻松解决SQL Server 2000 SP.
.循环插入一定时间范围内的随机日.
.一种通过sql server的作业调度+存.
.SQL2005中部署.net 3DES加密函数.
.sql server 2005中的except和INT.
.根据一定原则自动生成序列号的具.
.带你轻松接触一个数据库的备份和.
.轻松掌握使用SQL Server 浏览器.
.实例讲解SQL查询连续号码段的巧妙.
.分页存储过程2005 .
.SQL Server 2000 在 win2003上安.
.在SQL 2005中实现循环每一行做一.
.根据SQL存储过程名取得存储过程的.
.如何查看并导出数据表中字段的注.
.Sql server中时间查询的一个比较.
.sql server 2005中新增加的try c.
.SQL Server中利用存储过程来高性.
.讲解一个检索最近日期的采购价的.
.教你如何用SQL备份和还原数据库.

事务保存点在一个订购系统中的使用情况

发表日期:2008-7-21


保存点提供了一种机制,用于回滚部分事务。可以使用 SAVE TRANSACTION savepoint_name 语句创建一个保存点,然后再执行 ROLLBACK TRANSACTION savepoint_name 语句回滚到该保存点,从而无须回滚到事务的开始。


在不可能发生错误的情况下,保存点很有用。在很少出现错误的情况下使用保存点回滚部分事务,比让每个事务在更新之前测试更新的有效性更为有效。更新和回滚操作代价很大,因此只有在遇到错误的可能性很小,而且预先检查更新的有效性的代价相对很高的情况下,使用保存点才会非常有效。


下面的示例显示保存点在一个订购系统中的使用情况。该系统中存货不足的可能性很小,因为该公司具备有效的供应商和再订购点。通常应用程序在尝试更新订购记录时,会先验证手边是否有足够的存货。该示例假定由于某种原因(如连接到一个低速的调制解调器或广域网上),先验证可用存货的数量代价相对较大。可将应用程序编写为只进行更新,而且如果收到错误信息,表明库存不足时,将回滚该更新。在这种情况下,在插入之后快速检查 @@ERROR 比在更新之前验证库存数量速度要快得多。


InvCtrl 表有一个 CHECK 约束,如果 QtyInStk 列低于 0,就会触发 547 号错误。OrderStock 过程创建一个保存点。如果出现 547 错误,它将回滚到该保存点,并将当前手边有的项目数返回给调用进程。然后调用进程可以决定是否需要针对手边现有的数量重新下订单。如果 OrderStock 返回一个 0,则调用进程知道当前有足够的存货,可以满足订购需要。


SET NOCOUNT OFF

GO

USE pubs

GO

CREATE TABLE InvCtrl

(WhrhousID int,

PartNmbr int,

QtyInStk int,

ReordrPt int,

CONSTRAINT InvPK PRIMARY KEY

(WhrhousID, PartNmbr),

CONSTRAINT QtyStkCheck CHECK (QtyInStk > 0) )

GO


CREATE PROCEDURE OrderStock @WhrhousID int, @PartNmbr int,

@OrderQty int

AS

BEGIN TRANSACTION StkStock

DECLARE @ErrorVar int

SAVE TRANSACTION StkOrdTrn

UPDATE InvCtrl SET QtyInStk = QtyInStk - @OrderQty

WHERE WhrhousID = 1

AND PartNmbr = 1

SELECT @ErrorVar = @@error

IF (@ErrorVar = 547)

BEGIN

ROLLBACK TRANSACTION StkOrdTrn

RETURN (SELECT QtyInStk

FROM InvCtrl

WHERE WhrhousID = @WhrhousID

AND PartNmbr = @PartNmbr)

COMMIT TRANSACTION

END

ELSE

COMMIT TRANSACTION

RETURN 0

GO

insert InvCtrl(WhrhousID,PartNmbr,QtyInStk)values(1,1,2)

update InvCtrl set QtyInStk=2 where WhrhousID=1

exec OrderStock 1,1,1

上一篇:初学者必读:使用存储过程都有哪些益处 人气:1591
下一篇:用一个示例讲解自治事务和非自治事务的区别 人气:528
浏览全部事务保存点的内容 Dreamweaver插件下载 网页广告代码 祝你圣诞节快乐 2009年新年快乐