explicación de la propagación del comportamiento de propagación de transacciones de primavera
REQUIRED(TransactionDefinition.PROPAGATION_REQUIRED)
Explicación oficial: admite la transacción actual, si la transacción no existe, cree una nueva transacción. Similar a la propiedad de transacción del mismo nombre de EJB. Esta suele ser la configuración predeterminada para las definiciones de transacciones y normalmente define el alcance de la sincronización de transacciones.
Más profundo: el atributo requerido indica que el parámetro o método identificado debe existir; de lo contrario, se informará un error. De manera similar, en Spring mvc, @required Nombre de cadena.
Si la transacción es una llamada a un método anidado, el método marcado como requerido utilizará directamente la transacción externa. Si ocurre una excepción en la transacción, la reversión hará que el método de transacción externa también se revierta.
Por lo tanto, en general, para garantizar la coherencia de los datos locales, se utilizará REQIRED_NEW.
SUPPORTS(TransactionDefinition.PROPAGATION_SUPPORTS)
Explicación oficial: la transacción actual es compatible; si no existe, se ejecuta una no transacción. Similar a la propiedad de transacción del mismo nombre de EJB. Nota: Para los administradores de transacciones con sincronización de transacciones, el soporte de propagación es ligeramente diferente a ninguna transacción, porque define el alcance de la transacción a la que se puede aplicar la sincronización. Por lo tanto, se utilizará el mismo recurso (conexión JDBC, sesión de Hibernación, etc.) en todo el ámbito especificado. Tenga en cuenta que el comportamiento exacto depende de la configuración de sincronización real del administrador de transacciones. En general, ¡se debe utilizar el soporte diferencial! En particular, no confíe en las propagaciones que sean necesarias o que se propaguen dentro del alcance del soporte de propagación (esto puede causar conflictos de sincronización en tiempo de ejecución). Si este anidamiento es inevitable, asegúrese de que su administrador de transacciones esté configurado correctamente (generalmente cambiado a "sincronización real de transacciones").
Más profundo: este comportamiento no crea una transacción por sí solo. Cuando un método está marcado como compatible y un método externo abre una transacción y la llama, entonces el método también es un método de transacción. El efecto es el mismo que el solicitado, es decir, reversión.
Si el método externo no permite transacciones, entonces el método no realiza transacciones. En pocas palabras, este es el soporte definitivo. En el desarrollo real, si un método permite transacciones es un requisito muy claro; puede permitir transacciones o no utilizarlas, y no se definirá vagamente como usar transacciones y no usarlas al mismo tiempo.
NOT_SUPPORTED(TransactionDefinition.PROPAGATION_NOT_SUPPORTED)
Explicación oficial: realizar procesamiento no transaccional y suspender la transacción actual (si existe). Similar a la propiedad de transacción del mismo nombre de EJB. Nota: La suspensión de transacciones real no está disponible de forma inmediata en todos los administradores de transacciones. Esto se aplica especialmente a org.springframework.transaction.jta.JtaTransactionManager. JtaTransactionManager requiere la implementación de javax.transaction.TransactionManager. Esta característica solo está disponible con TransactionManager (en Java EE estándar, esta característica es específica del servidor).
Profundizar: Especifique explícitamente que el método identificado no debe utilizar transacciones. Cuando un método de transacción externa llama a este método, la transacción no ingresa a este método (es decir, la transacción externa se suspende) hasta que este método completa la ejecución.
NEVER(TransactionDefinition.PROPAGATION_NEVER)
Explicación oficial: la transacción actual no es compatible; si la transacción actual existe, se generará una excepción. Similar a la propiedad de transacción del mismo nombre de EJB. Tenga en cuenta que la sincronización de transacciones no está disponible en ámbitos que se propagan NUNCA.
Más profundo: esto es más estricto que not_supported y generará una excepción si se encuentra soporte de transacción externamente dentro de este método.
MANDATORY(TransactionDefinition.PROPAGATION_MANDATORY)
Explicación oficial: admite la transacción actual; si la transacción actual no existe, se generará una excepción. Similar a la propiedad de transacción del mismo nombre de EJB. Tenga en cuenta que la propagación obliga a que la sincronización de transacciones dentro de un alcance siempre esté impulsada por las transacciones circundantes.
Comprensión más profunda: Este es el antónimo de nunca. Debe haber una transacción dentro de una llamada interna o externa a un método obligatorio; de lo contrario, se generará una excepción.
NESTED(TransactionDefinition.PROPAGATION_NESTED)
Explicación oficial: si la transacción actual existe, la transacción se ejecuta en la transacción anidada como si fuera necesario propagarla. No existe una funcionalidad similar en EJB. Nota: La creación real de transacciones anidadas solo funciona con un administrador de transacciones específico. Cuando se trata de controladores JDBC 3.0, esto solo se aplica al JDBC DataSourceTransactionManager.
Más profundo: los métodos identificados como anidados utilizan el administrador de transacciones cuando llaman a otros métodos de transacción marcados como Obligatorio, Admite y Requerido, pero las reversiones de excepciones de los métodos de transacción internos no afectan los métodos externos.
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW)
Crea una nueva transacción para ejecutar el método identificado. Este método se utiliza para lograr coherencia en las operaciones generales de datos locales.
Publicación adicional: