我正在运行带有关联webjob的Azure web api。 webjob的实现将(在预定时间)通过首先从两者中删除所有内容然后执行批量插入来更新一对表(主表和详细信息)。主表有大约35,000行,详细信息大约145,000行。为了从web api的角度尽可能无缝地进行更新,我重构如下:
存储过程:
CREATE PROCEDURE MyProcedure
AS
BEGIN TRANSACTION
DELETE FROM [Content].MyDetail
DELETE FROM [Content].MyMaster
INSERT INTO [Content].MyMaster SELECT * FROM [Staging].MyMaster
INSERT INTO [Content].MyDetail SELECT * FROM [Staging].MyDetail
COMMIT TRANSACTION
在针对SQL Server Express环境的开发系统上进行测试时,此工作正常;它会在几秒钟内完成存储过程。但是,当部署到Azure时,处理与测试环境中完全相同的数据集时,即使允许最多5分钟,存储过程也会超时。
我已经花了一些时间来确保API方法(没有一个花费超过几秒钟的时间才能完成)总是自己清理。 API通过包装SqlConnection
的自定义对象与数据库交互。我的db包装器继承自IDisposable
,在处置时关闭连接;它是通过Unity使用PerRequestLifetimeManager
注入的。使用IList
等而不是IEnumerable
返回结果集合。据我了解,这应确保在请求完成时释放API请求期间使用的所有数据库资源。
尽管如此,我能想到的唯一解释是web api中的某些内容是锁定要由webjob更新的表,即使web api只读取它们。
什么可能阻止我的存储过程中的事务开始?