¿Qué sucede cuando se crean llamadas dosync anidadas? ¿Las subtransacciones se completarán en el alcance principal? ¿Estas sub-transacciones son reversibles si la transacción principal falla?¿Cómo se comportan las llamadas dosync anidadas?
Respuesta
Si se refiere a la anidación sintáctica, entonces la respuesta es que depende de si el interior dosync
se ejecutará en el mismo hilo como el exterior de uno.
En Clojure, cada vez que se ingresa un bloque dosync
, se inicia una nueva transacción si no se ha ejecutado uno ya en este hilo. Esto significa que mientras la ejecución se mantiene en un solo hilo, puede decirse que las transacciones internas están subsumidas por las transacciones externas; sin embargo, si un dosync
ocupa una posición sintácticamente anidada dentro de otro dosync
, pero sucede que se lanzará en un nuevo hilo, tendrá una nueva transacción para sí mismo.
Un ejemplo que (esperemos) ilustra lo que sucede:
user> (def r (ref 0))
#'user/r
user> (dosync (future (dosync (Thread/sleep 50) (println :foo) (alter r inc)))
(println :bar)
(alter r inc))
:bar
:foo
:foo
1
user> @r
2
La transacción "interior" reintenta después de la impresión :foo
; la transacción "externa" nunca necesita reiniciarse. (Tenga en cuenta que después de que esto suceda, la cadena de historial de r
crece, por lo que si se evalúa la forma "grande" dosync
por segunda vez, la dosync
interna no se volvería a intentar. Todavía no se fusionaría con la externa, por supuesto)
Por cierto, Mark Volkmann ha escrito un artículo fantástico sobre Clojure's Software Transactional Memory; es una lectura muy recomendable para cualquier persona interesada en obtener una visión sólida de los detalles de este tipo.
- 1. ¿Cómo se evitan las funciones anidadas cuando se usa AJAX?
- 2. ¿Cómo se comportan las actualizaciones de registros internamente?
- 3. ¿Cómo se comportan los submódulos en las páginas de github?
- 4. devoluciones de llamadas anidadas Refactoring, Node.js, asincrónicos
- 5. jQuery objeto diferido con llamadas ajax anidadas
- 6. ¿Cómo probar automáticamente que las aplicaciones se comportan como se espera con respecto a otras actividades?
- 7. ¿Cómo se definen las fábricas anidadas con FactoryGirl?
- 8. requireJS optimizer no incluye llamadas de solicitud anidadas
- 9. cola de python y cola de multiprocesamiento: ¿cómo se comportan?
- 10. Cómo "proteger" las llamadas AJAX?
- 11. pestañas Emacs se comportan exactamente como
- 12. ¿Por qué los parámetros se comportan así?
- 13. javascript setInterval: ¿se superponen las llamadas?
- 14. SmtpClient.SendAsync Las llamadas se cancelan automáticamente
- 15. ActiveRecord: ¿Cómo puedo clonar las asociaciones anidadas?
- 16. URI comenzando con dos barras ... ¿cómo se comportan?
- 17. ¿Cómo se comportan las transacciones distribuidas con múltiples conexiones al mismo DB en un entorno enhebrado?
- 18. ¿Cuándo y cómo se interrumpen las llamadas al sistema?
- 19. ¿Cómo se interceptan las llamadas al método de instancia?
- 20. Propósito de las transacciones anidadas
- 21. Las consultas de medios no se comportan como se esperaba en Android
- 22. ¿Cómo puedo asegurarme de que las transacciones anidadas se confirman de forma independiente?
- 23. xmlns = '' no se esperaba al deserializar las clases anidadas
- 24. ¿Cómo encuentro las llamadas a los métodos?
- 25. Cómo interceptar las llamadas al método dll?
- 26. Clojure STM (dosync) x bloque de sincronización de Java
- 27. ¿Cómo hacer todas las llamadas AJAX secuencialmente?
- 28. Cómo diseñar clases de plantilla anidadas donde las clases anidadas son del mismo tipo
- 29. Los valores de Float se comportan de forma diferente en las compilaciones de versión y depuración
- 30. ¿Por qué las comas se comportan de manera diferente en int.Parse() y decimal.Parse() con InvariantCulture?
Me gusta este ejemplo. –
¿Por qué el calificador "sintácticamente"? ¿Y qué significa sintácticamente? Soy un celador común y estoy acostumbrado a "léxicamente", como al cerrar las variables que son léxicamente visibles: (let ((x 42)) (lambda() x)) vs dynamically (es decir, encuadernado en la pila de llamadas en alguna parte) – kennytilton