Выполнить запрос внутри транзакции, но так чтобы изменения применились сразу

malov77
Дата: 28.04.2015 09:28:33
Всем доброго времени суток и солнечного настроения! :)
Есть SQL скрипт, в нём выполняется куча запросов, всё это завёрнуто в транзакцию, т.е. примерно так:
BEGIN TRAN
INSERT ...
INSERT ...
INSERT ...
UPDATE ...
.....
COMMIT TRAN

Для отслежки над чем сейчас трудится скрипт, я пишу текущую операцию в отдельную таблицу, что-то вроде лога.
Проблема в том, что запись в эту таблицу находится тоже внутри транзакции и посмотреть результат получается только после COMMIT TRAN. Без транзакций всё работает как надо.
Вопрос, как сделать чтобы один INSERT внутри транзакции выполнялся сразу? Чтобы можно было видеть записи в таблицу с логом во время выполнения.
Спасибо!
Glory
Дата: 28.04.2015 09:35:18
malov77
Вопрос, как сделать чтобы один INSERT внутри транзакции выполнялся сразу?

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

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

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

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

Так вам нужен лог или "отслежка над чем сейчас трудится скрипт" ?
malov77
Дата: 28.04.2015 09:38:46
Glory,

NOLOCK посмотрю, спасибо!
Мне нужен именно лог. Т.е. я туда пишу что-то подобное:
9:30 Создание объектов
9:31 Создано 187 объектов
9:32 Запись атрибутов
И т.д.
malov77
Дата: 28.04.2015 09:46:02
Похоже NOLOCK не совсем то.. Он применяется с FROM, а у меня там его нет.
Запрос выглядит так:
INSERT INTO TImpLog (MSG) VALUES ('Запись в лог')
Glory
Дата: 28.04.2015 09:48:55
malov77
Похоже NOLOCK не совсем то.. Он применяется с FROM, а у меня там его нет.


Интересно, а как вы делали " и посмотреть результат получается только после COMMIT TRAN. " без FROM ?
iap
Дата: 28.04.2015 09:50:31
malov77,

Сделайте табличную переменную и пишите лог внутри транзакции туда.
Если надо иметь его сохранённым в постоянной таблице, скопируйте туда после завершения транзакции.
iap
Дата: 28.04.2015 09:53:04
iap
malov77,

Сделайте табличную переменную и пишите лог внутри транзакции туда.
Если надо иметь его сохранённым в постоянной таблице, скопируйте туда после завершения транзакции.
Ой, у Вас же только COMMIT. Транзакция не откатывается...
Глори дело говорит.
malov77
Дата: 28.04.2015 09:55:59
Glory,

Я думал NOLOCK делается во время INSERT'а. Просто не понял.
А его значит надо применять при выборке из таблицы с логом?
SELECT * FROM TImpLog WITH (NOLOCK)
malov77
Дата: 28.04.2015 09:57:06
iap,

Да, всё верно. У меня транзакция и после её завершения я и так вижу записи таблицы, а мне надо именно увидеть их во время выполнения.
Glory
Дата: 28.04.2015 09:57:27
malov77
Я думал NOLOCK делается во время INSERT'а.

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

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

Вы всегда программируете методом профессора Тыка ?