Compartir a través de


Ejecución de mensajes en una sola transacción de base de datos

Es un requisito común en las aplicaciones empresariales coordinar los cambios de varias filas de tabla en el sistema de manera que todos los cambios de datos tengan éxito o ninguno lo haga. En términos de base de datos, esto se conoce como ejecutar varias operaciones en una sola transacción con la capacidad de revertir todos los cambios de datos si se produce un error en cualquier operación.

Puede ejecutar dos o más solicitudes en una sola transacción de base de datos mediante la solicitud de ExecuteTransactionRequest mensaje. Para usar este mensaje, rellene la Requests colección con dos o más solicitudes de organización que se van a ejecutar en la transacción. Establezca ReturnResponses en true si desea obtener una colección de respuestas, una para cada solicitud de mensaje ejecutada, en la colección Responses. Las solicitudes de mensaje de la Requests colección se ejecutan en orden tal como aparecen en la colección, donde se ejecuta primero el elemento en el índice 0. Este mismo orden se conserva en la Responses colección.

Si se produce un error en cualquiera de las solicitudes y se revierte la transacción, se deshacen los cambios de datos completados durante la transacción. Además, se devuelve un ExecuteTransactionFault que identifica el índice en la colección de solicitudes del mensaje de solicitud que produjo el error.

Un ExecuteMultipleRequest puede contener una o varias ExecuteTransactionRequest instancias. Es posible que una ExecuteTransactionRequest instancia no contenga un ExecuteMultipleRequest ni un ExecuteTransactionRequest. Para obtener más información sobre ExecuteMultipleRequest, consulte Ejecución de varias solicitudes mediante el SDK para .NET.

Más información: No usar tipos de solicitud por lotes en complementos y actividades de flujo de trabajo

Example

En este ejemplo se usa una sola llamada de método web para ejecutar todas las solicitudes de mensaje de una colección como parte de una única transacción de base de datos. También se muestra la configuración para modificar el comportamiento de ejecución.

// 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;
}

Consulte también

Usar mensajes con el SDK para .NET
Ejecución de varias solicitudes mediante el SDK para .NET