lo que se quiere resolver es la sincronización de dos modelos: Usted tiene el modelo en memoria y el modelo de base de datos. La simple propagación de cada cambio en la base de datos, como sucede, es demasiado costoso. Además, desea poder controlar los errores (es decir, retrotraer su modelo a un estado coherente). Para poder hacer esto, debes tener una forma de decir "ahora, es consistente".
La solución actual es iniciar una transacción en la base de datos cuando se sabe que el modelo es consistente (generalmente antes de comenzar a hacer cambios) y luego hacer todos los cambios en su modo en memoria, asignarlos de alguna manera a la base de datos , actualice la base de datos y luego confirme la transacción.
Si bien esto suena simple, la programación OO se interpone de manera activa. Ocultamos las operaciones de los modelos en lo más profundo de la estructura de las llamadas, intentamos realmente que los usuarios de un código no sepan lo que el código realmente hace. En un mundo perfecto, sus herramientas de desarrollo deberían desenrollar todo el código que necesita una operación en un solo método/función, envolverlo en una transacción y terminarlo.
Esto no funciona. En cambio, decidimos introducir una variable global: la sesión. Lo cual es malo, y estamos avergonzados de eso, así que tratamos de ocultar este hecho, pero la sesión es global, por operación. Ahora necesita una forma de adjuntar la sesión a la operación. Puede decir "todo el código que se ejecuta en el hilo actual es una operación". Si lo hace, la solución natural es hacer que la sesión sea global por hilo.
O tiene algún token. Luego, adjuntará la sesión al token y lo pasará por alto.
Pero el problema fundamental es y siempre fue: Cómo adjuntar una sesión a una sola operación en el modelo. Las partes difíciles deben saber cuándo comienza una operación, cuándo finaliza y cómo manejar los errores.
Para las aplicaciones web, usar una solicitud es la forma natural de definir una operación: todo lo que sucede durante una solicitud se considera un solo paso.La aplicación realmente no mantiene el modelo en la memoria; todo se olvida al final de la solicitud y se carga de nuevo desde la base de datos cuando entra la siguiente solicitud. Lento pero manejable.
Las aplicaciones de escritorio son un tipo de bestia completamente diferente. Por lo general, mantienen todo el modelo en la memoria todo el tiempo. No persistimos los cambios a menos que el usuario lo solicite (cuando "guarda" su trabajo) porque eso sería demasiado lento y, como no hay nada como una solicitud, no hay una forma simple y automática de definir una "operación" .
La idea de adjuntar una operación a un evento es buena. Solo que, en las aplicaciones de escritorio, puede tener múltiples hilos que se comunican con eventos y ahora necesita una forma de marcar todos los eventos como "pertenecen a la operación iniciada con el evento X recibido hace mucho tiempo". Los eventos suelen ser datos pequeños e inmutables, por lo que no puede adjuntarles su sesión. Pero necesitas algún tipo de token para marcar todos los eventos que pertenecen juntos. Por eso, la mayoría de las aplicaciones de escritorio funcionan con un servidor (que también funciona como una aplicación web) y sin un gran modelo en memoria o no usan una base de datos, pero guardan su modelo en un formato personalizado (piense en Office).
¿Has abandonado la pregunta? – Surya
Mayormente, sí. <> – Tordek
Han pasado 3 años y no obtuvo la respuesta adecuada. Yo tampoco. A veces tengo la sensación de que incluso los chicos de JBoss no saben cómo usar su propio producto. Solo uso una sesión por evento. –