事务保存点在一个订购系统中的使用情况
作者: 茶晶, 出处:赛迪网 , 责任编辑: 王晓晨,
2008-07-25 08:10
保存点提供了一种机制,用于回滚部分事务。可以使用 SAVE TRANSACTION savepoint_name 语句创建一个保存点,然后再执行 ROLLBACK TRANSACTION savepoint_name 语句回滚到该保存点,从而无须回滚到事务的开始。
保存点提供了一种机制,用于回滚部分事务。可以使用 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 |
- 本文关键词:

