2016-02-23 97 views
0

我有一個存儲過程(簡化版本),如下所示。通常它會將未決項目推送到電子郵件隊列並將這些項目的狀態更新爲推送。此存儲過程已在60秒內調用。SQL Server中的存儲過程中的語句執行

ALTER PROCEDURE [dbo].[CreateEmailQueue] 
AS 
BEGIN 
    insert into EmailQueue 
     select * 
     from actionstatus 
     where actionstatus='Pending' 

    update actionstatus 
    set actionstatus = 'Pushed' 
    where actionstatus = 'Pending' 
END 

它工作正常,但我發現一個例外記錄。異常的操作狀態已更改爲「推送」,但該記錄未出現在EmailQueue中。我懷疑動作狀態記錄是在插入之後但在更新之前生成的。但我並不是100%確定的,因爲我認爲SQL Server總是在隔離塊中執行存儲過程,所以數據更改不會影響執行中的數據集。有人可以幫助解釋存儲過程中的實際過程,檢查這個存儲過程並告知它是否正確,或者它應該放在事務塊中?以及在交易中做到這一點的任何性能或鎖定問題?感謝您的輸入。

回答

0

您必須在存儲過程中使用transactin。 SQL Server不會自動爲存儲過程調用生成事務。你可以簡單地檢查它由執行代碼類似taht:

insert ... 
--this will falls 
select 1/0 

插入會做,比你零錯誤

有分工
相關問題