webjob

时间:2016-05-15 17:14:13

标签: sql-server azure stored-procedures azure-webjobs

我正在运行带有关联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只读取它们。

什么可能阻止我的存储过程中的事务开始?

0 个答案:

没有答案