2012-02-13 16 views
5

he encontrado la siguiente hilo: How exactly JdbcTemplate with TransactionManager works together?¿El administrador de transacciones de Spring vincula una conexión a un hilo?

La primera frase de que:

Por lo que comprendía DataSourceTransactionManager une una conexión JDBC desde el origen de datos especificado para el subproceso actual, lo que permite un hilo-bound Conexión por DataSource. Si se trata de un conjunto de conexiones, tomará una de las conexiones disponibles.

... es exactamente lo que quiero saber.

Al usar un administrador de transacciones, ¿termina con cada hilo que tiene su propia conexión? Además, ¿cuánto tiempo vive esa conexión? ¿El mismo hilo usa la misma conexión a lo largo de una sola solicitud, o hay algo más que está pasando? Solo trato de entender qué hace exactamente Spring cuando tienes un administrador de transacciones y cuándo no (independientemente de si tienes una transacción o no).

Respuesta

10

Al usar un administrador de transacciones, ¿termina con cada hilo que tiene su propia conexión? Además, ¿cuánto tiempo vive esa conexión?

La conexión generalmente se obtiene de un grupo de conexiones. La conexión se toma prestada del grupo cuando el administrador de transacciones inicia la transacción y luego se devuelve al grupo cuando finaliza la transacción. Durante ese tiempo, la conexión está ligada al hilo.

hace lo mismo hilo utilizar la misma conexión a lo largo de una única solicitud

Se utiliza la misma conexión por la duración de la transacción. La solicitud en sí es irrelevante.

independientemente de si está o no en realidad tiene una transacción

Usted siempre tienen una transacción, si lo hace de forma explícita o no. Si no configura uno explícitamente, el controlador JDBC y la base de datos se iniciarán y terminarán uno todo el tiempo que sea necesario para realizar la operación individual. La gestión de transacciones de Spring (o la gestión de transacciones de cualquier otro marco) le permite extender la vida útil de esa transacción en múltiples operaciones. Hacerlo requiere el uso exclusivo de la conexión durante la transacción.

+0

Gracias por su respuesta. Me ayuda a entender un poco más de lo que está pasando. Entiendo cómo la gestión de transacciones permite que la transacción se extienda para operaciones múltiples. Sin embargo, en mi caso, tengo @Transactional (propagation = Propagation.SUPPORTS) en cada uno de mis métodos DAO, lo que significa que cada llamada usará su propia transacción independiente. Después de que el administrador obtiene una conexión inicial del grupo, ¿enlaza esa conexión con el hilo actual y luego la recupera desde allí durante la vida del hilo, en lugar de volver al grupo para obtener una conexión? – dnc253

+0

"cada llamada usará su propia transacción independiente" - esto no es cierto. Su DAO "heredará" cualquier transacción existente que ya esté vinculada al hilo. no comenzará una nueva a menos que ya no haya ninguna. – skaffman

+1

Supongo que la forma en que estoy definiendo "transacción" no es totalmente correcta.La forma en que he entendido una transacción es cuando tienes una única operación de base de datos (que podría tener cualquier cantidad de actualizaciones, inserciones, etc.). Todo sucede o nada sucede. La forma en que se configura el DAO, cada método operará en el DB independientemente de los otros métodos. Si un método falla, no afectará las operaciones realizadas por otros métodos antes o después de la falla. Entonces, ¿qué es exactamente una "transacción"? Estaba pensando que cada método crearía su propia transacción, pero aparentemente ese no es el caso. – dnc253

Cuestiones relacionadas