我们最近遇到了客户端计算机中Sql server死锁的问题。 我们怀疑这是由于经常安排工作A,工作B,工作C。
一个。工作A - 每15分钟一次 湾工作B - 每20分钟一次 C。工作C-每30分钟
这些间隔不会因数据量而异,这会导致作业重叠执行。 此外,如果有人工干预,那么我们如何确保作业完成其待处理的任务?
1.有没有办法创建依赖性工作?
这样我们就可以让Job B等待Job A进程完成,Job C等待Job B进程完成。
2.如何处理最坏的情况,如果工作失败,那么如何恢复交易?
3.有没有办法在SSIS作业状态下编写和跟踪自定义日志文件/电子邮件警报?
提前致谢
答案 0 :(得分:1)
我目前正在处理这个问题,将其作为工作的第一步:
-- Check running SQL Agent jobs. If there are any 'Load' jobs then don't run this one.
-- This step has 3 retries at 5 minutes each
IF EXISTS
(
SELECT sj.name, sja.*
FROM msdb.dbo.sysjobactivity AS sja
INNER JOIN msdb.dbo.sysjobs AS sj ON sja.job_id = sj.job_id
WHERE sja.start_execution_date IS NOT NULL
AND sja.stop_execution_date IS NULL
AND sj.name LIKE 'Load%'
)
RAISERROR('Job is still currently running. Cannot run this job in parallel. This step will retry.',18,0)
然后在高级选项卡中设置步骤,以任何间隔重试多少次。如果另一个作业已在运行(在此示例中以Load
开头的作业名称标识,则会发生错误并重试。
避免死锁的另一个选择是:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
添加到查询的开头以减少争用....但您应该首先了解这一点。答案 1 :(得分:0)
它有点笨拙,但是每个作业都有一个标记文件,它们在启动时会清除,并在它们结束时写入。下一个作业需要在开始之前检查上一个作业的标志文件。当然,如果作业试图多次启动并且标志文件不存在,它会发送一个被阻止的电子邮件,因此人们可以解决问题,让事情再次正常开始。
恢复失败将是独立的,取决于你如何解决第一个问题。
您可以将特定项目作为一个进程的一部分写入日志,并使用另一个SSIS包监视该文件,并在遇到某个文本时发送电子邮件。该日志也可以用来代替标志文件,但你需要知道完成的进程A是当前的进程,而不是15分钟之前的进程。