none
Service Broker Beispiel RRS feed

Antworten

Alle Antworten

  • Hallo

    kennst Du die Tutorials? Hier findest Du eine Menge Code-Beispiele samt Erläuterungen:

    Service Broker Tutorials

    Beginner's Guide to SQL Server Service Broker

    Diese empfehle ich mal durchzuarbeiten, dann sollte das Konzept klar werden.

    Ansonsten wäre es hilfreich, eine etwas detailliertere Skize Deines geplanten Workflows zu haben, um beurteilen zu können, ob das so geht und welche Steps dafür nötig sind.


    Andreas Wolter (Blog | Twitter)
    MCSM: Microsoft Certified Solutions Master Data Platform, MCM, MVP
    www.SarpedonQualityLab.com | www.SQL-Server-Master-Class.com

    • Als Antwort vorgeschlagen Tobias Scholze Donnerstag, 21. Mai 2015 07:08
    • Als Antwort markiert uhp Dienstag, 26. Mai 2015 19:06
    Donnerstag, 21. Mai 2015 06:51
  • eine Prozedur mit zwei int Parametern asynchron aufrufe.

    Hallo,

    über den Service Broker kannst Du Stored Procedure ausrufen, nennt sich "interne Aktivierung", nur direkt Parameter kannst Du hier nicht übergeben. Du musst die Parameter in die Nachricht verpacken, die an die Queue übergeben wird, die SP holt sich dann die Nachricht ab und muss aus der die Parameter auslesen.

    Ein ganz einfaches Beispiel hatte ich mal erstellt: Service Broker: Asynchrone Ausführung von Stored Procedures


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    • Als Antwort markiert uhp Dienstag, 26. Mai 2015 19:06
    Donnerstag, 21. Mai 2015 07:56
  • Vielen Dank euch beiden. Ich werde mir die Sachen in Ruhe ansehen und werde mal skizzieren, was ich genau vorhabe
    Donnerstag, 21. Mai 2015 17:16
  • @Olaf: Ich habe mir dein Beispiel angesehen und habe die Prozedur spQueueWorkerTest wie folgt geändert:

    CREATE PROCEDURE spQueueWorkerTest 
    AS 
    BEGIN 
    	DECLARE @RecvReqDlgHandle UNIQUEIDENTIFIER; 
    	DECLARE @RecvReqMsg NVARCHAR(100); 
    	DECLARE @RecvReqMsgName sysname; 
    
    	WHILE (1=1)
    	BEGIN
    		BEGIN TRANSACTION;
     
    		WAITFOR
    		(
    			RECEIVE TOP(1) 
    				@RecvReqDlgHandle = conversation_handle, 
    				@RecvReqMsg = message_body, 
    				@RecvReqMsgName = message_type_name 
    			FROM AsyncWorkerQueue 
    		), TIMEOUT 5000;
    
    		IF (@@ROWCOUNT = 0)
    		BEGIN
    			ROLLBACK TRANSACTION;
    			BREAK;
    		END
    
    		--Nachricht auch für mich gedacht? 
    		IF @RecvReqMsgName = N'//AWDB/AsyncWork/Message' 
    		BEGIN 
    			-- Aktivität protokollieren 
    			INSERT INTO AsyncWorkerHist (LogDate, LogAction, LogMessage, LogBody) VALUES (GetDate(), 'Started', @RecvReqMsgName, @RecvReqMsg); 
    
    			-- 2 min so tun, als sein man mächtig beschäftigt
    			WAITFOR DELAY '00:01';  
    
    			-- Aktivität protokollieren 
    			INSERT INTO AsyncWorkerHist (LogDate, LogAction, LogMessage, LogBody) VALUES (GetDate(), 'Finished', @RecvReqMsgName, @RecvReqMsg); 
    
    			-- Jetzt könnte man eine Nachricht zurück senden 
    		END
    	COMMIT TRANSACTION;
      END
    END;

    Ich habe also eine Transaktion eingefügt und lasse die Nachrichten parallel ablaufen. Nur kann ich jetzt während der Service läuft nicht mehr auf die Tabelle AsyncWorkerHist zugreifen. Nur wenn ich das Transaktionslevel auf READ_COMMITTED_SNAPSHOT setze, klappt es. Wieso ist das so? Ich müsste doch zumindest auf die bereits bestehenden Daten bei READ_COMMITTED zugreifen können.

    Danke und Grüße

    webbies


    • Bearbeitet uhp Freitag, 22. Mai 2015 13:37
    Freitag, 22. Mai 2015 13:33
  • Nur wenn ich das Transaktionslevel auf READ_COMMITTED_SNAPSHOT setze, klappt es.

    Das war nur als simples Beispiel gedacht, nicht was man produktiv nutzen würde/sollte.

    Es wird eine Transaktion begonnen, ein Datensatz eingefügt; wenn die Tabelle vorher leer war, ist nun ein Datensatz in der Tabelle, die durch die Transaktion gesperrt ist; de fakto ist also die ganze Tabelle gesperrt.
    Zu Demo-Zwecken warten die SP nun 1 Minute lang und in der ganzen Zeit bleibt die Tabelle gesperrt; erst mit dem Commit wird die Sperre aufgehoben.

    Entferne das "WAITFOR", dann sollte es so funktionieren.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Freitag, 22. Mai 2015 13:55
  • ich hatte nicht vor, das so produktiv einzusetzen, fand das Beispiel aber sehr gut, um zu sehen, wie der Service Broker abläuft :)
    Freitag, 22. Mai 2015 15:10