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

Откуда:
Сообщений: 15
Всем доброго времени суток и солнечного настроения! :)
Есть SQL скрипт, в нём выполняется куча запросов, всё это завёрнуто в транзакцию, т.е. примерно так:
BEGIN TRAN
INSERT ...
INSERT ...
INSERT ...
UPDATE ...
.....
COMMIT TRAN

Для отслежки над чем сейчас трудится скрипт, я пишу текущую операцию в отдельную таблицу, что-то вроде лога.
Проблема в том, что запись в эту таблицу находится тоже внутри транзакции и посмотреть результат получается только после COMMIT TRAN. Без транзакций всё работает как надо.
Вопрос, как сделать чтобы один INSERT внутри транзакции выполнялся сразу? Чтобы можно было видеть записи в таблицу с логом во время выполнения.
Спасибо!
28 апр 15, 09:28    [17573463]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
Вопрос, как сделать чтобы один INSERT внутри транзакции выполнялся сразу?

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

malov77
Проблема в том, что запись в эту таблицу находится тоже внутри транзакции и посмотреть результат получается только после COMMIT TRAN.Без транзакций всё работает как надо.

Узнайте, что такое NOLOCK и грязные данные

malov77
Для отслежки над чем сейчас трудится скрипт, я пишу текущую операцию в отдельную таблицу, что-то вроде лога.

Так вам нужен лог или "отслежка над чем сейчас трудится скрипт" ?
28 апр 15, 09:35    [17573485]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
Glory,

NOLOCK посмотрю, спасибо!
Мне нужен именно лог. Т.е. я туда пишу что-то подобное:
9:30 Создание объектов
9:31 Создано 187 объектов
9:32 Запись атрибутов
И т.д.
28 апр 15, 09:38    [17573499]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
Похоже NOLOCK не совсем то.. Он применяется с FROM, а у меня там его нет.
Запрос выглядит так:
INSERT INTO TImpLog (MSG) VALUES ('Запись в лог')
28 апр 15, 09:46    [17573525]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
Похоже NOLOCK не совсем то.. Он применяется с FROM, а у меня там его нет.


Интересно, а как вы делали " и посмотреть результат получается только после COMMIT TRAN. " без FROM ?
28 апр 15, 09:48    [17573535]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
malov77,

Сделайте табличную переменную и пишите лог внутри транзакции туда.
Если надо иметь его сохранённым в постоянной таблице, скопируйте туда после завершения транзакции.
28 апр 15, 09:50    [17573540]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
iap
malov77,

Сделайте табличную переменную и пишите лог внутри транзакции туда.
Если надо иметь его сохранённым в постоянной таблице, скопируйте туда после завершения транзакции.
Ой, у Вас же только COMMIT. Транзакция не откатывается...
Глори дело говорит.
28 апр 15, 09:53    [17573548]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
Glory,

Я думал NOLOCK делается во время INSERT'а. Просто не понял.
А его значит надо применять при выборке из таблицы с логом?
SELECT * FROM TImpLog WITH (NOLOCK)
28 апр 15, 09:55    [17573559]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
iap,

Да, всё верно. У меня транзакция и после её завершения я и так вижу записи таблицы, а мне надо именно увидеть их во время выполнения.
28 апр 15, 09:57    [17573562]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
Я думал NOLOCK делается во время INSERT'а.

Нет вы ПРИдумали. А надо сначала читать хелп, а потом думать.

malov77
А его значит надо применять при выборке из таблицы с логом?

Вы всегда программируете методом профессора Тыка ?
28 апр 15, 09:57    [17573564]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
У меня транзакция и после её завершения я и так вижу записи таблицы, а мне надо именно увидеть их во время выполнения.

А что будет с вашей транзакцией, если какая то из команд завершится ошибкой, вы уже подумали ?
28 апр 15, 09:58    [17573568]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
Glory,

У меня всё внутри TRY CATCH и в случае ошибки делается ROLLBACK TRAN.
28 апр 15, 10:13    [17573647]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
_djХомяГ
Guest
Ну если ROLLBACK то необходимо делать по совету iap через табл переменную
28 апр 15, 10:15    [17573659]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
А как из неё сделать выборку во время работы скрипта?
Точнее даже, как сделать эту переменную глобальной, чтобы можно было к ней обратиться из любого места?
28 апр 15, 10:24    [17573698]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
Точнее даже, как сделать эту переменную глобальной, чтобы можно было к ней обратиться из любого места?

Никак.
Поэтому я вас и спрашивал - вы логирование делаете или мониторинг.
28 апр 15, 10:25    [17573704]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
malov77
Member

Откуда:
Сообщений: 15
Glory,

Подскажите, пожалуйста, как тогда сделать мониторинг?
Или это имеется ввиду SQL Server Profiler?
28 апр 15, 10:28    [17573714]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Glory
Member

Откуда:
Сообщений: 104751
malov77
Подскажите, пожалуйста, как тогда сделать мониторинг?

print/raiserror

malov77
Или это имеется ввиду SQL Server Profiler?

Да хотя бы и он
28 апр 15, 10:29    [17573724]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8828
Для протоколирования изменений в таблицах независимо от транзакции можно использовать service broker + пользовательские события трассировки:
https://www.sql.ru/forum/1144921/i-snova-pro-avtonomnye-tranzakcii-s-pomoshhu-clr
28 апр 15, 12:56    [17574983]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
malov77
Подскажите, пожалуйста, как тогда сделать мониторинг?
Для логирования пишите в табличную переменную, в конце (после отката или коммита траназкции) - переносите её содержимое в постоянную таблицу с логами.

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

Для объединения логирования и мониторинга пишите данные в табличную переменную и в таблицу лога.
В обработчике ошибок, после отката, опять запишите содержимое табличной переменной в постоянную таблицу лога.
28 апр 15, 14:19    [17575605]     Ответить | Цитировать Сообщить модератору
 Re: Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
alexeyvg
Но данные исчезнут при коммите
При роллбэке наверно?
28 апр 15, 14:22    [17575636]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить