Partager via


Exécuter des messages en une seule transaction de base de données

C’est une exigence courante 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’entre elles ne réussisse. 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 ou plusieurs requêtes dans une seule transaction de base de données à l’aide du message ExecuteTransactionRequest. Pour utiliser ce message, entrez Requests avec deux requêtes d’organisation ou plus qui doivent être exécutées dans la transaction. Définissez ReturnResponses true si vous souhaitez revenir à une collection de réponses, une pour chaque demande de message exécutée, dans la collection Responses . Les requêtes de message dans la collection Requests 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 collection Responses .

En cas d’échec de l’une des demandes et de la restauration de la transaction, toutes les modifications apportées aux données pendant la transaction seront annulées. En outre, ExecuteTransactionFault est retourné avec identification de l’index dans la collection de messages de demande à l’origine de l’erreur.

ExecuteMultipleRequest peut contenir une ou plusieurs instances de ExecuteTransactionRequest. Une instance de ExecuteTransactionRequest ne peut pas contenir ExecuteMultipleRequest ou ExecuteTransactionRequest. Pour plus d’informations sur ExecuteMultipleRequest, voir Exécuter plusieurs requêtes à l’aide du SDK pour .NET.

Exemple

Cet exemple utilise un appel de méthode Web simple pour exécuter toutes les requêtes de message dans une collection dans le cadre d’une transaction de base de données unique. Les paramètres pour modifier le comportement d’exécution sont également montré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

Utiliser les messages avec le SDK pour .NET
Exécuter plusieurs requêtes à l’aide du SDK pour .NET

Notes

Pouvez-vous nous indiquer vos préférences de langue pour la documentation ? Répondez à un court questionnaire. (veuillez noter que ce questionnaire est en anglais)

Le questionnaire vous prendra environ sept minutes. Aucune donnée personnelle n’est collectée (déclaration de confidentialité).