熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

事務保存點在一個訂購系統中的使用情況

2013-11-13 12:34:53  來源: SQL語言 

  保存點提供了一種機制用於回滾部分事務可以使用 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


From:http://tw.wingwit.com/Article/program/SQL/201311/16176.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.