具有事务范围的 Azure 服务总线

问题描述

命名空间Azure.Messaging.ServiceBus

我在 ServiceBusSender.SendMessageAsync 操作周围使用事务范围,并收到“其他资源管理器/DTC 不支持本地事务。”

事务范围是否可以与 Azure 服务总线一起使用?

当前范围

using (var transaction = new TransactionScope(
   TransactionScopeOption.required,new Transactionoptions
   {
      IsolationLevel = IsolationLevel.Serializable
   },TransactionScopeAsyncFlowOption.Enabled))
{
   try
   {
     // do a database operation
     // do azure bus sendmessageasync
   }
    catch
   {
      transaction.dispose();
      throw;
   }
}

解决方法

使用 Azure.Messaging.ServiceBus(轨道 2)SDK 可以进行跨实体交易。

var options = new ServiceBusClientOptions { EnableCrossEntityTransactions = true };
await using var client = new ServiceBusClient(connectionString,options);

ServiceBusReceiver receiverA = client.CreateReceiver("queueA");
ServiceBusSender senderB = client.CreateSender("queueB");
ServiceBusSender senderC = client.CreateSender("topicC");

ServiceBusReceivedMessage receivedMessage = await receiverA.ReceiveMessageAsync();

using (var ts = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
    await receiverA.CompleteMessageAsync(receivedMessage);
    await senderB.SendMessageAsync(new ServiceBusMessage());
    await senderC.SendMessageAsync(new ServiceBusMessage());
    ts.Complete();
}

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...