电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

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


发布日期:2020/3/25
 

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

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

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

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

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 > ) )

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 =

AND PartNmbr =

SELECT @ErrorVar = @@error

IF (@ErrorVar = )

BEGIN

ROLLBACK TRANSACTION StkOrdTrn

RETURN (SELECT QtyInStk

FROM InvCtrl

WHERE WhrhousID = @WhrhousID

AND PartNmbr = @PartNmbr)

COMMIT TRANSACTION

END

ELSE

COMMIT TRANSACTION

RETURN

GO

insert InvCtrl(WhrhousIDPartNmbrQtyInStk)values()

update InvCtrl set QtyInStk= where WhrhousID=

exec OrderStock

上一篇:ST

下一篇:初学者必读:使用存储过程都有哪些益处