Partager via


Exécuter des messages dans une transaction de base de données unique

Il est courant dans les applications métier de coordonner les modifications de plusieurs lignes de table dans le système afin que toutes les modifications de données réussissent ou qu’aucune d’elles ne le fasse. En termes de base de données, il s’agit d’exécuter plusieurs opérations dans une seule transaction avec la possibilité d’annuler toutes les modifications si une seule échoue.

Vous pouvez exécuter deux requêtes ou plus dans une transaction de base de données unique à l’aide de la demande de ExecuteTransactionRequest message. Pour utiliser ce message, renseignez la Requests collection avec deux ou plusieurs requêtes d'organisation à exécuter dans la transaction. Définissez ReturnResponses sur true si vous souhaitez obtenir une collection de réponses, une pour chaque demande de message exécutée, dans la collection Responses. Les demandes de message dans la Requests collection sont exécutées dans l’ordre où elles apparaissent dans la collection, où l’élément à l’index 0 est exécuté en premier. Ce même ordre est conservé dans la Responses collection.

Si l’une des requêtes échoue et que la transaction est restaurée, toutes les modifications de données effectuées pendant la transaction sont annulées. En outre, un ExecuteTransactionFault est renvoyé, identifiant l'index dans la collection de requêtes du message de requête qui a provoqué le défaut.

Un ExecuteMultipleRequest peut contenir une ou plusieurs ExecuteTransactionRequest instances. Une instance ExecuteTransactionRequest peut ne pas contenir un ExecuteMultipleRequest ni un ExecuteTransactionRequest. Pour plus d’informations sur ExecuteMultipleRequest, consultez Exécuter plusieurs requêtes à l’aide du Kit de développement logiciel (SDK) pour .NET.

Plus d’informations : N’utilisez pas les types de requêtes par lots dans les plug-ins et les activités de flux de travail

Example

Cet exemple utilise un appel de méthode web unique pour exécuter toutes les demandes de message dans une collection dans le cadre d’une transaction de base de données unique. Les paramètres permettant de modifier le comportement d’exécution sont également affichés.

// Create an ExecuteTransactionRequest object.
var requestToCreateRecords = new ExecuteTransactionRequest()
{
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection(),
ReturnResponses = true
};

// Create several (local, in memory) entities in a collection. 
var input = new EntityCollection()
{
EntityName = Account.EntityLogicalName,
Entities = {
            new Account { Name = "ExecuteTransaction Example Account 1" },
            new Account { Name = "ExecuteTransaction Example Account 2" },
            new Account { Name = "ExecuteTransaction Example Account 3" },
            new Account { Name = "ExecuteTransaction Example Account 4" },
            new Account { Name = "ExecuteTransaction Example Account 5" }
        }
};

// Add a CreateRequest for each entity to the request collection.
foreach (var entity in input.Entities)
{
CreateRequest createRequest = new CreateRequest { Target = entity };
requestToCreateRecords.Requests.Add(createRequest);
}

// Execute all the requests in the request collection using a single web method call.
try
{
var responseForCreateRecords =
    (ExecuteTransactionResponse)svc.Execute(requestToCreateRecords);

int i = 0;
// Display the results returned in the responses.
foreach (var responseItem in responseForCreateRecords.Responses)
{
    if (responseItem != null)
    Console.WriteLine("Created " + ((Account)requestToCreateRecords.Requests[i].Parameters["Target"]).Name
        + " with account id as " + responseItem.Results["id"].ToString());
    i++;
}
}
catch (FaultException<OrganizationServiceFault> ex)
{
Console.WriteLine("Create request failed for the account{0} and the reason being: {1}",
    ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
throw;
}

Voir aussi

Utilisez les messages avec le SDK pour .NET
Exécuter plusieurs requêtes à l’aide du Kit de développement logiciel (SDK) pour .NET