TransactionScope espera una llamada a su método completo de la siguiente manera. De lo contrario, la transacción no se confirmará.¿Por qué TransactionScope no asume el éxito?
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
scope.Complete();
}
¿No sería más apropiada una implementación que asuma el éxito? Esto significaría que se necesitaría menos código en el caso estándar (éxito).
En el caso de una excepción o una llamada a un método como 'Rollback' (este método no existe actualmente) la transacción podría revertirse.
using(TransactionScope scope = new TransactionScope())
{
/* Perform transactional work here */
if(problemOccurred)
{
scope.Rollback();
}
}
Tenga en cuenta que el indicador de problemaOcurrido solo sería necesario en los casos en que el problema no dio lugar a una excepción. En este caso, la reversión se realizará automáticamente.
Estoy interesado en obtener más información sobre por qué se utilizó esta implementación.
Actualización: Hasta ahora, algunas de las respuestas han argumentado que se necesitaría un bloque try-catch si se utilizara la implementación que describí. Este no es el caso. La transacción se retrotrae automáticamente cuando no se maneja una excepción dentro del bloque de uso. Este es el caso tanto en la implementación existente como en la que describí. Consulte "Completar un alcance de transacción" en la sección here para obtener más detalles.
Actualización 2: Finalmente entiendo lo que se explica en las respuestas. Esta no es una construcción de lenguaje que podría haber sido interpretada de la manera que los diseñadores de lenguaje lo vieron, es una implementación del patrón IDisposable. Sin la llamada para completar el código dentro del método de eliminación, no tendría conocimiento de si se está llamando como resultado del código dentro del bloque de uso que se está ejecutando correctamente o porque se produjo una excepción. Estaba imaginando algo similar a lo siguiente donde tanto la transacción como la reversión son palabras clave.
transaction
{
/* Perform transactional work here */
if(problemOccurred)
{
rollback;
}
}
Por supuesto, esto presenta problemas si las opciones de transacción tienen que pasarse a la TransactionScope.
¿Por qué no se agrega automáticamente mi comentario cuando cambio de página, no debería tener que hacer clic en [Agregar comentario] ... – cjk
De actualización - El * mecanismo * por el cual se retrotrae la transacción ante excepciones es que llegas al final del bloque de uso sin llamar a Commit. Es decir. ese comportamiento depende de la función exacta que desea eliminar. –
Su "actualización" se refiere al estado actual del juego: si TransactionScope asumió el éxito, usted estaría cambiando esa situación. –