Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Непонятное поведение процедуры в джобе  [new]
Marcodus
Member

Откуда:
Сообщений: 6
Дня доброго.
В шаге джоба вызывается процедура, которая апдейтит курсором записи в двух таблицах на основном и прилинкованном серверах.

ALTER PROCEDURE [dbo].[UpdateFlagPhoto]
AS
BEGIN
 DECLARE @IdZap bigint,
         @ANR varchar(50),
         @FlagUpdate tinyint
        

 DECLARE CurVyb1 INSENSITIVE CURSOR
  FOR
   SELECT T1.IdZap,LEFT(T1.ANR,50) AS ANR
    FROM [СЕРВЕР2].PHOTO.dbo.PHOTO AS T1 with(nolock)
   WHERE T1.FlagUpdate=0 AND T1.ANR IS NOT NULL
  FOR
   READ ONLY
-- открываем курсор
  OPEN CurVyb1
  FETCH NEXT FROM CurVyb1 INTO @IdZap,@ANR
  WHILE @@FETCH_STATUS=0
   BEGIN
    SET @FlagUpdate=0
-- проверка на обновление записи
    PRINT @IdZap
    
    --BEGIN TRANSACTION    
     UPDATE TableSubmission SET FlagPhoto=1
      WHERE AppId=@ANR
    --COMMIT TRANSACTION
    
    SET @FlagUpdate=(SELECT FlagPhoto FROM TableSubmission WITH(nolock) WHERE AppId=@ANR)
    
    IF @FlagUpdate=1
     BEGIN

      UPDATE [СЕРВЕР2].PHOTO.dbo.PHOTO SET FlagUpdate=1
       WHERE ANR=@ANR 
    
     END
    
    FETCH NEXT FROM CurVyb1 INTO @IdZap,@ANR
   END
 DEALLOCATE CurVyb1
END


+
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64)
Jun 28 2012 08:36:30
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)


Странно то, что на сервер2 записи апдейтятся нормально, а вот на основном сервере каждый день 20-50 записей с FlagPhoto=0.
Как видите пробовал обернуть в транзакцию апдейт на основном сервере - толку нет :(
При запуске запроса из МС - отрабатывает как нужно, а из джоба нет.
Джоб запускается на основном сервере, база и пользователь в шаге прописаны.

Уже всю голову сломал
7 фев 14, 13:43    [15534334]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Marcodus
Странно то, что на сервер2 записи апдейтятся нормально, а вот на основном сервере каждый день 20-50 записей с FlagPhoto=0.

А откуда известно, что эти записи были такими на момент работы процедуры ?
А откуда известно, что эти записи были выбраны курсором ? Или наоборот не выбраны ?
7 фев 14, 13:47    [15534373]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Marcodus
Member

Откуда:
Сообщений: 6
Glory
А откуда известно, что эти записи были такими на момент работы процедуры ?
А откуда известно, что эти записи были выбраны курсором ? Или наоборот не выбраны ?


1. Известно
2. Если записи бы не были выбраны, ко как был бы выставлен на СЕРВЕР2 флаг FlagUpdate=1?

и к тому же не обрабатывается 20-50 записей из ~4000
7 фев 14, 14:04    [15534518]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Marcodus
1. Известно

Вы где логируете свои действия ? Вы где-то логируете все действия таблицей TableSubmission ?

Marcodus
2. Если записи бы не были выбраны, ко как был бы выставлен на СЕРВЕР2 флаг FlagUpdate=1?

А где гарантия, что после этого данные в TableSubmission не менялись ?
7 фев 14, 14:10    [15534580]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Marcodus
Member

Откуда:
Сообщений: 6
Glory
Вы где логируете свои действия ? Вы где-то логируете все действия таблицей TableSubmission ?
А где гарантия, что после этого данные в TableSubmission не менялись ?


Действия не логирую, по причине ненужности.
Данные в этой таблице могут меняться только процедурой выполняемой на одном из предыдущих шагов этого самого джоба.
Читается таблица только в вышеприведенной процедуре.
Обертка в транзакцию не помогает.
И почему в джобе только такое бывает?

Какие у Вас по ситуации этой предположения быть могут?
7 фев 14, 14:32    [15534759]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Marcodus
Какие у Вас по ситуации этой предположения быть могут?

Логировать действия

Честного слова для подтверждения того, что
- изменения были сделаны
- изменения были сделаны процедурой
- изменения были сделаны только процедурой
недостаточно
7 фев 14, 14:35    [15534780]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Marcodus
Member

Откуда:
Сообщений: 6
Glory
Логировать действия

Честного слова для подтверждения того, что
- изменения были сделаны
- изменения были сделаны процедурой
- изменения были сделаны только процедурой
недостаточно


Какое именно логирование нужно?

Насколько понимаю есть подозрения, что в TableSubmission каким-то образом изменяются записи после отработки джоба?
7 фев 14, 15:46    [15535376]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Marcodus
Какое именно логирование нужно?

Обыкновенное, кто, когда и как поменял запись в таблице
Кроме того, надо логировать, что попало в курсор.

Marcodus
Насколько понимаю есть подозрения, что в TableSubmission каким-то образом изменяются записи после отработки джоба?

Либо после, либо вовремя. У вас же там
- грязные чтения
- курсор, который создан на этих грязных чтениях. Вот что было прочитано при [СЕРВЕР2].PHOTO.dbo.PHOTO AS T1 with(nolock) ?
7 фев 14, 15:53    [15535429]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Marcodus
Member

Откуда:
Сообщений: 6
Glory
Либо после, либо вовремя. У вас же там
- грязные чтения
- курсор, который создан на этих грязных чтениях. Вот что было прочитано при [СЕРВЕР2].PHOTO.dbo.PHOTO AS T1 with(nolock) ?


1. грязные чтения потому что в [СЕРВЕР2].PHOTO.dbo.PHOTO идут инсерты с частотой 5-20 в минуту и остановить процесс этот нельзя, потому и апдейт в курсоре чтобы не было блокировок.
7 фев 14, 16:55    [15535931]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
Marcodus
1. грязные чтения потому что в [СЕРВЕР2].PHOTO.dbo.PHOTO идут инсерты с частотой 5-20 в минуту и остановить процесс этот нельзя, потому и апдейт в курсоре чтобы не было блокировок.

Ну вот и откуда вам тогда известно, чего и сколько вы прочитали с [СЕРВЕР2] ?
А здесь зачем тогда грязные чтения - SET @FlagUpdate=(SELECT FlagPhoto FROM TableSubmission WITH(nolock) WHERE AppId=@ANR) ?

Зачем вообще вот этот кусок ?
UPDATE TableSubmission SET FlagPhoto=1
WHERE AppId=@ANR
--COMMIT TRANSACTION

SET @FlagUpdate=(SELECT FlagPhoto FROM TableSubmission WITH(nolock) WHERE AppId=@ANR)
Т.е. изменили поле, а потом еще для уверенности прочитали оттуда значение ?
А если прочитанное значение уже другое ?
7 фев 14, 17:00    [15535967]     Ответить | Цитировать Сообщить модератору
 Re: Непонятное поведение процедуры в джобе  [new]
Glory
Member

Откуда:
Сообщений: 104751
И у вас нет ни одной проверки, обновили ли ваши команды хоть сколько то записей.
Совпало ли элементарно число итераций цикла с числом обновлений в локальной таблице, а число обновлений в локальной таблицк с числом обновлений в линкованной таблице
7 фев 14, 17:05    [15536004]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить