我有一个存储过程(简化版),如下所示。通常,它会将待处理项目推送到电子邮件队列并更新要推送的项目的状态。此存储过程已在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总是在隔离块中执行存储过程,因此数据更改不会影响执行中的数据集。有人可以帮助解释存储过程中的实际进程,查看这个存储过程并告知它是否正常,或者它应该放在事务块中?以及在交易中执行此操作的任何性能或锁定问题?感谢您的投入。
答案 0 :(得分:0)
您必须在存储过程中使用transactins。 SQL Server不会自动为存储过程调用生成事务。您可以通过执行代码来检查它,例如taht:
insert ...
--this will falls
select 1/0
将完成插入,并且您将进行除零错误