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

Откуда:
Сообщений: 21336
Всем поклон!

Ломаю голову. MS SQL 2008 R2.
Есть стороннее приложение, которое выполняет вставку классической схемы данных для
документа - заголовок дока и его строки.
Логика такова, что сначала вставляются строки! и только затем заголовок.
Это подтверждается траасировкой - последовательность именно такая,
в рамках одной транзакции проходит вставка и строк, и заголовка.

На таблицу заголовка повесили триггер, который обрабатывает строки.
И по прошествии некоторого времени заметили, что НЕ ВСЕГДА при вызове триггера
на вставку заголовка видны строки документа. Иногда не видны вообще, иногда
видна только часть строк, но чаще - все строки.
Убедились, что это не зависит от логики внешнего приклада - если поднять резерв БД
и повторить на копии процесс, то строки дока к моменту вызова триггера уже все в наличии.
Повесил ещё один триггер - на вставку строк дока, сделал логгирование в журнал.
И убедился, что строки вставляются по сути "параллельно" с отработкой триггера -
в логе запись о вызове триггера на вставку в таблицу заголовка находится МЕЖДУ
вставками строк. Соответственно те записи, которые к моменту вставки заголовка
были в строках - обработаны.

Слабо понимаю, что происходит? Почему исполнение операций не последовательное?
На всякий - внешний приклад ставит READ UNCOMMITED, но операции вставки выполняет с
хинтом INSERT INTO ... WITH (REPEATABLEREAD)



Пресветлый старец Фалоим Московскый.
тимтэг:некоммерческое товарищество "Напиджак",
издательство "Московский Пустомолец"

Картинка с другого сайта.
25 фев 14, 16:01    [15626830]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3274
Разные транзакции (и коннекты) при вставке мастера и деталей, как вариант.

spid, который инсерт делает, отслеживали?
25 фев 14, 16:04    [15626869]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
Слабо понимаю, что происходит? Почему исполнение операций не последовательное?

Потому что команды, вызывающие срабатывание триггеров, непоследовательны ?
25 фев 14, 16:06    [15626890]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
Судя по всему доступа к скриптам нет?
Если бы был, то почему сначала вставляются строки -
ведь наоборот удобнее!
А если так, то какова свобода действия?
На что есть возможность повлиять, а на что нет?

Иначе насоветуют, и всё впустую.
25 фев 14, 16:16    [15627016]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory
МистерШоу
Слабо понимаю, что происходит? Почему исполнение операций не последовательное?

Потому что команды, вызывающие срабатывание триггеров, непоследовательны ?


Вставка строк документа и затем заголовка идёт последовательно, в рамках
ОДНОЙ(TransactionID) транзакции эвентсиквенс по нарастанию, вставка заголовка замыкает лог.
25 фев 14, 16:21    [15627062]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
Вставка строк документа и затем заголовка идёт последовательно, в рамках
ОДНОЙ(TransactionID) транзакции эвентсиквенс по нарастанию, вставка заголовка замыкает лог.

Вы это в профайлере видели ? Или в тексте программы ?
25 фев 14, 16:22    [15627081]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
прям параллелизм какой-то...
25 фев 14, 16:22    [15627082]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory, в профайлере - только на него опираюсь.
25 фев 14, 16:23    [15627092]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
iap
Member

Откуда: Москва
Сообщений: 47001
МистерШоу
Glory
пропущено...

Потому что команды, вызывающие срабатывание триггеров, непоследовательны ?


Вставка строк документа и затем заголовка идёт последовательно, в рамках
ОДНОЙ(TransactionID) транзакции эвентсиквенс по нарастанию, вставка заголовка замыкает лог.
Но ведь потом UPDATE должен быть?
Или айдишник заголовка генерируется заранее?
25 фев 14, 16:25    [15627118]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
iap
Но ведь потом UPDATE должен быть?
Или айдишник заголовка генерируется заранее?


Именно, обычная логика нумераторов с прегенерацией номера дока.
25 фев 14, 16:27    [15627146]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
Glory, в профайлере - только на него опираюсь.

Тогда про какой лог вы говорите, где "И убедился, что строки вставляются по сути "параллельно" с отработкой триггера " ???
25 фев 14, 16:27    [15627151]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
iap
Судя по всему доступа к скриптам нет?
Если бы был, то почему сначала вставляются строки -
ведь наоборот удобнее!
А если так, то какова свобода действия?
На что есть возможность повлиять, а на что нет?

Иначе насоветуют, и всё впустую.


нет, закрытый код.
25 фев 14, 16:28    [15627155]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory
МистерШоу
Glory, в профайлере - только на него опираюсь.

Тогда про какой лог вы говорите, где "И убедился, что строки вставляются по сути "параллельно" с отработкой триггера " ???


а, это дубовый способ для экспертизы инцидента - EXEC xp_logevent в триггерах.
ну и результаты обработки подтверждают - как в логе, так и в результатах.
25 фев 14, 16:30    [15627183]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
а, это дубовый способ для экспертизы инцидента - EXEC xp_logevent в триггерах.
ну и результаты обработки подтверждают - как в логе, так и в результатах.

Ничего не понял
Вы хотите сказать, что в Профайлере и в вашем "дубовом способе" разное время начала одной и той же команды ???
25 фев 14, 16:32    [15627200]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory, вот выдержка из винлога:

02/25/2014 11:23:42,spid69,Unknown,312-010223 rownum 822732279
02/25/2014 11:23:42,spid69,Unknown,312-010223 rownum 822732278
02/25/2014 11:23:42,spid69,Unknown,312-010223 rownum 822732277
02/25/2014 11:23:42,spid69,Unknown,312-010223 rownum 822732276
02/25/2014 11:22:50,spid69,Unknown,rows in [lines]:50
02/25/2014 11:22:50,spid69,Unknown,call t_header for doc:312-010223
02/25/2014 11:22:47,spid69,Unknown,312-010223 rownum 822732275
02/25/2014 11:22:47,spid69,Unknown,312-010223 rownum 822732274
02/25/2014 11:22:47,spid69,Unknown,312-010223 rownum 822732273
02/25/2014 11:22:47,spid69,Unknown,312-010223 rownum 822732272
02/25/2014 11:22:47,spid69,Unknown,312-010223 rownum 822732271

... и так ещё 45 строк ранее.

Всего же в доке 54 строки.
записи
02/25/2014 11:22:50,spid69,Unknown,rows in [lines]:50
02/25/2014 11:22:50,spid69,Unknown,call t_header for doc:312-010223

сделаны триггером заголовочной таблицы, остальные - триггер таблицы строк документа.
Что за задержка почти в минуту - не могу понять.
При попытке воспроизвести на резерве - трассировка строго последовательная.
Таких инцидентов несколько, в общей массе случаются относительно редко и НИ РАЗУ
на копии их воспроизвести не удалось.
25 фев 14, 16:53    [15627408]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
Glory, вот выдержка из винлога:

Это ответ на вопрос ?
Время запуска первой команды триггера в Профайлере и в вашем методе одинаковое или разное ?
25 фев 14, 16:55    [15627421]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory, разное - трассировку профайлера мы получаем при попытке воспроизведения инцидента на копии.
25 фев 14, 16:58    [15627444]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
разное - трассировку профайлера мы получаем при попытке воспроизведения инцидента на копии.

Ваше логирование работает неправильно
25 фев 14, 16:59    [15627457]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory, вполне допускаю, однако
триггер заголовка странным образом возвращает именно то количество строк,
которые и по нашему способу логгирования в винлог вставлены ДО вызова триггера заголовка.

Счетчик строк документа также вернул значение 50, что соответствует хронологии винлога.
Ну и обработка строк тоже дала такой же результат.
25 фев 14, 17:04    [15627521]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
разработчик подтвердил, что в коде никакой условной обработки и вставки
записей до/после заголовка не выполняется - все строки дока вставляются ДО
вставки заголовка.
Косвенно это подтверждается тем, что на копии БД ситуация не воспроизводится -
при том же состоянии данных приложения отрабатывает ожидаемым образом, то есть
к моменту вызова триггера заголовка все строки уже вставлены.
25 фев 14, 17:07    [15627557]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
триггер заголовка странным образом возвращает именно то количество строк,
которые и по нашему способу логгирования в винлог вставлены ДО вызова триггера заголовка.

И это доказывает, что команды insert выполняются параллельно, хотя они написаны последовательно ?
25 фев 14, 17:09    [15627573]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory
МистерШоу
триггер заголовка странным образом возвращает именно то количество строк,
которые и по нашему способу логгирования в винлог вставлены ДО вызова триггера заголовка.

И это доказывает, что команды insert выполняются параллельно, хотя они написаны последовательно ?


Это лишь доказывает, что к моменту вызова триггера заголовка не все записи
строк были вставлены. Возможно, они выполняются последовательно, но не единой
последовательностью. Хотя логика приложения, и воспроизведение на копии
показывают сначала единую последовательную вставку строк, и только затем - заголовка.
25 фев 14, 17:16    [15627645]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
Glory
Member

Откуда:
Сообщений: 104760
МистерШоу
Это лишь доказывает, что к моменту вызова триггера заголовка не все записи
строк были вставлены.

Что в свою очередь доказывает, что команда записи в заголовок выполняется раньше команд записи деталей.
25 фев 14, 17:18    [15627667]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
Glory
МистерШоу
Это лишь доказывает, что к моменту вызова триггера заголовка не все записи
строк были вставлены.

Что в свою очередь доказывает, что команда записи в заголовок выполняется раньше команд записи деталей.


Отчего такой вывод? Если бы это было так, то триггер вставки заголовка не видел бы вообще
никаких строк. Однако это не так.
25 фев 14, 17:23    [15627712]     Ответить | Цитировать Сообщить модератору
 Re: Триггер на мастер-таблице не видит всех строк детализации в собственной транзакции  [new]
МистерШоу
Member

Откуда:
Сообщений: 21336
ЗЫ: Учитывая INSERT INTO ... WITH (REPEATABLEREAD)
25 фев 14, 17:24    [15627724]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить