Tengo dos ámbitos de transacción, uno dentro de otro. Me encantaría saber si el alcance interno de la transacción se retrotraerá después de que se haya confirmado y el externo no se complete.¿Se retrotraerá el alcance de una transacción interna si no se completa el alcance de la transacción externa?
Respuesta
Dado que están anidados, la transacción interna se retrotraerá.
Esta no es toda la historia, y depende de cómo se crea la transacción anidada, pero de forma predeterminada, se retrotraerá.
This article entra en profundidad sobre TransactionScope
y debería responder la mayoría de sus preguntas.
Ser distribuido o no es irrelevante.
Depende de la opción de alcance con la que inicie el ámbito de transacción anidado.
Si usa la opción predeterminada TransactionScopeOption.Required
, el alcance anidado se enlistará en la misma transacción que el ámbito externo y, como tal, cuando el ámbito externo retroceda, el ámbito interno también se retrotraerá aunque haya llamado al Complete
.
Si, sin embargo, usa TransactionScopeOption.RequiresNew
, el alcance anidado comenzará su propia transacción y lo completará por separado del ámbito externo, por lo que no se retrotraerá aunque el alcance externo retroceda.
Si utiliza TransactionScopeOption.Suppress
, el alcance anidado no participará en la transacción externa y se completará de forma no transaccional, por lo tanto no forma parte del trabajo que se retrotraerá si la transacción externa se retrotrae.
Respuesta perfecta :) –
- 1. "La operación no es válida para el estado de la transacción" Alcance del error y la transacción
- 2. Alcance de transacción autónoma y aumento de error
- 3. Transacción dentro de la transacción
- 4. ¿Se ha bloqueado el bloqueo de transacción?
- 5. HibernateDaoSupport, la transacción no se ha retrotraído
- 6. Mongoid, alcance si se establece un valor?
- 7. Cómo encontrar el estado de la transacción
- 8. ¿Cómo se implementa el Alcance léxico?
- 9. ¿Se inicia una transacción incluso en SELECT?
- 10. Transacción distribuida completada. O bien aliste esta sesión en una nueva transacción o la transacción NULA
- 11. PSQLException: transacción actual se aborta, comandos ignorados hasta el final del bloque de transacción
- 12. ¿Se usará una instrucción para deshacer una transacción de base de datos si se produce un error?
- 13. ¿Se puede usar MySqlBulkLoader con una transacción?
- 14. cómo se implementa el concepto de transacción en EJB
- 15. PGError: ERROR: la transacción actual se cancela
- 16. Múltiples SubmitChanges y retrotracción de transacción utilizando Linq To SQL
- 17. maven proporcionó el alcance
- 18. Determine si la transacción es transacción DTC o no al depurar
- 19. La transacción SQLite no funciona como se esperaba
- 20. nueva transacción en el frijol de primavera
- 21. ¿Determinar el alcance de sincronización?
- 22. método de instancia en el alcance
- 23. No se puede deshacer la transacción en Zend Framework
- 24. ¿Cuál es el alcance de let cuando se usa sin?
- 25. Indicando si una transacción tiene actualizaciones no confirmadas
- 26. transacción anidada sobre el Spring
- 27. ¿Qué sucede si no revierte una transacción en Hibernate?
- 28. ¿Cómo se detecta que la transacción ya se inició?
- 29. La transacción de rieles no se revierte en el error de validación
- 30. C# - ¿Los objetos se destruyen inmediatamente cuando salen del alcance?
@Frantisek hizo mención de las transacciones distribuidas. ¿Cómo sé que estoy usando una transacción distribuida? – Tebo
Supongo que estaba equivocado. Con TransactionScope, probablemente no necesite dtc para que funcione. Lea esto http://msdn.microsoft.com/en-us/library/ms172152(v=vs.90).aspx: "Aunque un ámbito anidado se puede unir a la transacción ambiental del ámbito raíz, llamando a Complete en el ámbito anidado no tiene efecto en el alcance de la raíz. Solo si todos los alcances del alcance de la raíz hasta el último alcance anidado votan para comprometer la transacción, se comprometerá la transacción ". –
Estoy seguro de que lo sabe, pero los términos "transacción interna" y "transacción anidada" son IMHO inapropiados cuando se habla de TransactionScope, porque en realidad no hay transacciones anidadas, sino solo TransactionScopes anidados. Si elige TransactionScopeOption.Required, es solo 1 transacción grande y con TransactionScopeOption.RequiereNew hay 2 transacciones completamente independientes, pero no están anidadas en el sentido de transacciones (cerradas) anidadas. –