2016-02-23 88 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 

插入会做,比你零错误

有分工
相关问题