WalzoneInterview Prep
📞 Interviewing soon? Practice with a realistic AI mock phone interview — it calls you, then scores you. First 15 min FREE →

SQL Server · Expert · question 64 of 100

How do you implement and manage SQL Server Service Broker for asynchronous messaging and distributed transactions?

📕 Buy this interview preparation book: 100 SQL Server questions & answers — PDF + EPUB for $5

SQL Server Service Broker is a message-based communication system built into the SQL Server Database Engine. Applications can use it to easily and reliably send and receive messages between different SQL Server instances, databases, and even language platforms. It also supports distributed transactions, making it a suitable choice for implementing reliable and scalable asynchronous messaging solutions.

Here are the steps to implement and manage SQL Server Service Broker for asynchronous messaging and distributed transactions:

1. Enable Service Broker: Before you can use Service Broker, you need to enable it on the databases where you want to use it. To do that, execute the following T-SQL command:

   ALTER DATABASE [DatabaseName] SET ENABLE_BROKER;

2. Create message types: Message types define the format and structure of the messages that can be sent and received by Service Broker endpoints. You can create message types using the following T-SQL command:

   CREATE MESSAGE TYPE [MessageType] 
   VALIDATION = NONE;

For example, the following command creates a message type called "OrderMessage" with the "XmlSchema" message format:

   CREATE MESSAGE TYPE [OrderMessage]
   VALIDATION = NONE
   FORMAT = XML
   XmlSchema('<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"/>');

3. Create contracts: Contracts define the message types that can be exchanged between Service Broker endpoints. You can create contracts using the following T-SQL command:

   CREATE CONTRACT [ContractName]
   ([MessageType] SENT BY [Sender] 
   [, [MessageType] SENT BY [Sender]]*);

For example, the following command creates a contract called "OrderContract" that allows the "OrderMessage" message type to be sent by the "OrderSender" endpoint:

   CREATE CONTRACT [OrderContract]
   (OrderMessage SENT BY INITIATOR);

4. Create queues: Queues hold the messages sent and received by Service Broker endpoints. You can create queues using the following T-SQL command:

   CREATE QUEUE [QueueName];

For example, the following command creates a queue called "OrderQueue":

   CREATE QUEUE [OrderQueue];

5. Create services: Services define the endpoints for Service Broker communication. You can create services using the following T-SQL command:

   CREATE SERVICE [ServiceName] 
   ON QUEUE [QueueName] 
   ([ContractName]);

For example, the following command creates a service called "OrderService" that uses the "OrderQueue" queue and the "OrderContract" contract:

   CREATE SERVICE [OrderService]
   ON QUEUE [OrderQueue] 
   ([OrderContract]);

6. Send messages: You can send messages using the following T-SQL command:

   SEND ON CONVERSATION [ConversationHandle]
   MESSAGE TYPE [MessageType]
   ([MessageBody]);

For example, the following command sends an "OrderMessage" to the "OrderService" endpoint:

   DECLARE @conversationHandle UNIQUEIDENTIFIER;
   BEGIN DIALOG @conversationHandle 
   FROM SERVICE [OrderSender] 
   TO SERVICE 'OrderService' ON CONTRACT [OrderContract];
   
   SEND ON CONVERSATION @conversationHandle
   MESSAGE TYPE [OrderMessage]
   ('<Order><ProductId>1</ProductId><Quantity>10</Quantity></Order>');

7. Receive messages: You can receive messages using the following T-SQL command:

   RECEIVE TOP(1) 
   CONVERT([DataType], [MessageBody]) AS [MessageBody]
   FROM [QueueName];

For example, the following command receives a message from the "OrderQueue" queue:

   DECLARE @messageBody NVARCHAR(MAX);
   
   RECEIVE TOP(1) 
   CONVERT(NVARCHAR(MAX), [MessageBody]) AS [MessageBody]
   FROM [OrderQueue];
   
   SELECT @messageBody;

8. Handle transactions: Service Broker supports distributed transactions, which allow multiple operations across multiple databases and servers to be treated as a single atomic transaction. To start a new transaction, you can use the BEGIN TRANSACTION statement. To commit or rollback a transaction, you can use the COMMIT TRANSACTION or ROLLBACK TRANSACTION statement.

For example, the following command starts a new transaction and sends a message using Service Broker:

   BEGIN TRANSACTION;
   
   DECLARE @conversationHandle UNIQUEIDENTIFIER;
   BEGIN DIALOG @conversationHandle 
   FROM SERVICE [OrderSender] 
   TO SERVICE 'OrderService' ON CONTRACT [OrderContract];
   
   SEND ON CONVERSATION @conversationHandle
   MESSAGE TYPE [OrderMessage]
   ('<Order><ProductId>1</ProductId><Quantity>10</Quantity></Order>');
   
   COMMIT TRANSACTION;

If an error occurs, you can roll back the transaction using the ROLLBACK TRANSACTION statement:

   BEGIN TRANSACTION;
   
   DECLARE @conversationHandle UNIQUEIDENTIFIER;
   BEGIN DIALOG @conversationHandle 
   FROM SERVICE [OrderSender] 
   TO SERVICE 'OrderService' ON CONTRACT [OrderContract];
   
   SEND ON CONVERSATION @conversationHandle
   MESSAGE TYPE [OrderMessage]
   ('<Order><ProductId>1</ProductId><Quantity>10</Quantity></Order>');
   
   SELECT 1/0; -- cause an error
   
   ROLLBACK TRANSACTION;

In addition to the above steps, managing Service Broker involves monitoring the queues, services, and endpoints to ensure that they are running smoothly and handle any issues that arise. You can use the sys.transmission_queue, sys.dm_broker_queue_monitors, and sys.dm_broker_activated_tasks system views to monitor Service Broker activity. You can also use the ALTER ENDPOINT, ALTER QUEUE, and ALTER SERVICE statements to modify existing Service Broker objects.

Reading is step one. Saying it out loud is the interview. Our AI interviewer calls your phone and runs a realistic SQL Server interview — then scores it.
📞 Practice SQL Server — free 15 min
📕 Buy this interview preparation book: 100 SQL Server questions & answers — PDF + EPUB for $5

All 100 SQL Server questions · All topics