Antes de hablar sobre Spring Transaction Management, pensemos en cómo realizamos operaciones de datos en Hibernate cuando no usamos Spring. En Hibernate, primero debemos iniciar la transacción, luego realizar operaciones de datos, luego enviar la transacción y cerrar la transacción. La razón por la que hacemos esto es porque la confirmación automática de transacción predeterminada de Hibernate es falsa, lo que requiere que presentemos manualmente la transacción. Si no desea enviar manualmente la transacción cada vez, puede configurarlo para confirmar automáticamente la transacción en mi archivo hibernate.cfg.xml:
código XML
<Property name = "DefaultAutOcommit"> <value> False </value> </property>
A pesar de que establecemos su método de confirmación de transacción en automático, puede realizar operaciones de datos, esto no satisface nuestras necesidades comerciales reales, porque a veces después de guardar un datos, espero que pueda continuar guardando otros datos. Espero cometer la transacción junta después de guardar dos o más datos. De esta manera, incluso si hay un error, podemos retroceder y asegurar la consistencia de los datos. Ya sea el éxito o el fracaso. En este momento, no podemos cometer automáticamente la transacción después de guardar un datos, porque no están en la misma transacción, y no podemos garantizar la consistencia de los datos. Entonces, en este momento, necesitamos configurar manualmente nuestras transacciones, lo que requiere el uso del mecanismo de gestión de transacciones proporcionado por Spring para Hibernate. La gestión de la transacción proporcionada por Spring se puede dividir en dos categorías: programática y declarativa. La programación en realidad está controlada en el código. Al igual que Hibernate opera datos, inicia transacciones y envía transacciones. Este método tiene ciertas limitaciones, por lo que generalmente usamos declarativo para configurar nuestras transacciones.
La configuración de la transacción declarativa se divide principalmente en los siguientes pasos:
1. Configuración de transacciones declarativas
(1) Configure el Administrador de transacciones;
(2) las características de propagación de la transacción;
(3) Esas clases y métodos usan transacciones.
< <tx: atributes> <tx: método name = "save*" propagation = "requerido"/> <tx: método name = "eliminar*" propagation = "requirido"/> <tx: método name = "update*" propagation = "requerido"/> <tx: método name = "get*" lead-iLy = "true" propagation = "no_supported"/> <<tx: name = "get*" lead--a- "verdadero" propagation = "no_supported"/> <<tx: name = "*"*"" Propagation = "NOT_SUPPORTADO"/> <<tx: Method name = " lectura de lectura = "true"/> </tx: atributas> </tx: consejo> <!-qué métodos de esas clases participan en transacciones-> <aop: config> <aop: pointcut id = "allserviceMethod" expresion = "ejecution (*com.coe.service.*.*(..))"/> <aop: asesor de puntos de asesor-ref = "Allservicemetodeod" " consejo-ref = "txadvice"/> </aop: config>
Al configurar las transacciones, generalmente establecemos el límite de transacciones en la capa de servicio, es decir, su capa lógica de negocios, porque a menudo completamos algunas de nuestras columnas de operaciones de datos en nuestra capa lógica comercial. Si se coloca en la capa de datos DAO, la granularidad es demasiado pequeña. Además, si configuramos transacciones en la capa lógica de negocios, también será beneficioso para nuestro caché secundario, que encontrará en el futuro cuando realmente la opere.
2. Escribir métodos lógicos comerciales
En este momento, podemos usar los métodos de operación de datos proporcionados en HibernateTemplate para escribir nuestros métodos lógicos comerciales en nuestra capa lógica comercial. Por supuesto, nuestro método debe ser el mismo que se configuró en nuestra configuración de transacciones, utilizando Guardar, Eliminar, Actualizar y obtener el comienzo de nuestro método. Cabe señalar que, de forma predeterminada, la excepción de tiempo de ejecución solo retrocederá (incluida la heredar la subclase RuntimeException), y las excepciones ordinarias no se lanzarán.
Finalmente, resumamos las diversas características de propagación de las transacciones:
1. Propagation_Required: si existe una transacción, se admite la transacción actual. Si no hay transacción, se habilitará;
2. Propagation_Supports: si existe una transacción, se admite la transacción actual. Si no hay transacción, la ejecución de no transacciones;
3. Propagation_mandatory: si ya existe una transacción, se admite la transacción actual. Si no hay una transacción activa, se lanza una excepción;
4. Propagation_requires_new: siempre abra una nueva transacción. Si ya existe una transacción, la transacción existente está suspendida;
5. Propagation_Not_Supported: siempre ejecute no transaccionalmente y suspenda cualquier transacción existente;
6. Propagation_Never: siempre ejecutado no transaccionalmente, si existe una transacción activa, se lanza una excepción;
7. Propagation_nested: si existe una transacción activa, se ejecuta en una transacción anidada. Si no hay una transacción activa, ejecutarla de acuerdo con la propiedad TransactionDefinition.Propagation_Required.
A través de este artículo, espero que pueda ayudarlo a comprender la gestión integrada de transacciones de Spring y Hibernate. ¡Gracias por su apoyo para este sitio web!