Регистрация прогресса в транзакции - PullRequest
2 голосов
/ 25 декабря 2011

Я хотел бы отобразить обратную связь для пользователя во время выполнения хранимой процедуры (несколько установок).Весь SQL-код находится в транзакции, поэтому я использую сервисный брокер для получения обновлений в реальном времени.Не могли бы вы подсказать, что не так с кодом ниже, так как я не получаю никаких сообщений в своей очереди?
Есть ли лучший способ сделать это?

--queue
create queue myQueue

--service
create service myLogs
on queue myQueue ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);

--log handler
create event notification myLogHandler
on  server
for userconfigurable_0
to service 'myLogs', 'current database' ;

--message
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'test msg'

---transaction test
begin transaction
EXEC master..sp_trace_generateevent @event_class = 82, @userinfo = N'tran test msg'
rollback transaction


--receive message
declare @message_body  xml;  
receive  top (1) @message_body = message_body
from myQueue
select @message_body

--display queue  
select * from myQueue

Ответы [ 2 ]

3 голосов
/ 09 сентября 2015

Возможно более простой способ:

--------------------------------
--Worker process 
--------------------------------

BEGIN TRANSACTION

--While in your loop or at each stage of the proc you can do this
INSERT INTO MyLoggingTable VALUES('My Message')

COMMIT

--------------------------------
--Reporting process
--------------------------------

SELECT * FROM MyLoggingTable WITH (NOLOCK)

NOLOCK позволяет вам читать ход процесса, даже если он записан в него внутри транзакции.

ОБРАТИТЕ ВНИМАНИЕ, что это позволяет вам читать данные «LIVE», но если рабочий процесс делает откат, тогда данные будут удалены.

Вы можете обойти это путем также регистрации в @MyTable, это выдержит откат, и вы сможете откатиться, а затем скопировать содержимое @MyTable в MyLoggingTable.

1 голос
/ 25 декабря 2011

Это прекрасно работает для меня, хотя мне нужно было подождать несколько секунд и снова запустить бит получения из очереди, прежде чем я что-либо увидел.

Возможно, вам нужно ENABLE_BROKER в базе данных.

ALTER DATABASE YourDB SET  ENABLE_BROKER WITH  ROLLBACK IMMEDIATE

( Предупреждение : уничтожит существующие подключения к БД)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...