在SQL Server中的存储过程中执行语句

时间:2016-02-23 04:24:54

标签: sql-server stored-procedures transactions

我有一个存储过程(简化版),如下所示。通常,它会将待处理项目推送到电子邮件队列并更新要推送的项目的状态。此存储过程已在60秒间隔内调用。

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

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

它工作正常,但我找到了一个例外记录。异常的操作状态已更改为" Pushed"但记录没有出现在EmailQueue中。我怀疑在插入之后但在更新之前已经生成了操作状态记录。但我并不是百分之百确定,因为我认为SQL Server总是在隔离块中执行存储过程,因此数据更改不会影响执行中的数据集。有人可以帮助解释存储过程中的实际进程,查看这个存储过程并告知它是否正常,或者它应该放在事务块中?以及在交易中执行此操作的任何性能或锁定问题?感谢您的投入。

1 个答案:

答案 0 :(得分:0)

您必须在存储过程中使用transactins。 SQL Server不会自动为存储过程调用生成事务。您可以通过执行代码来检查它,例如taht:

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

将完成插入,并且您将进行除零错误