En primer lugar, la gestión de transacciones debe realizarse en la capa de servicio, no en la capa DAO, ya que eso generaría una gran sobrecarga de rendimiento (para tratar el nivel de aislamiento de transacción y la propagación adecuados en cada método diferente). Además, el alcance de una unidad de trabajo proviene de la capa de servicio en lugar de la capa de acceso a datos: imagine realizar un proceso de negocio que necesita tratar con 2 o más DAO.
Hay mucha discusión en Internet que apunta en esa dirección como aquí , aquí y aquí .
De todos modos, dado que es una entrevista, aceptemos la pregunta tal como está. Desde mi punto de vista, estaría utilizando la @Transactional
anotación (o la configuración XML) en ambos métodos y con una propagación de transacciones con REQUIRED
valor. De esa manera, cuando se invoque cualquiera de esos métodos y si no existe una transacción previa, se creará una nueva transacción:
@Transactional
class MyDAO {
@Transactional(propagation = REQUIRED)
public void foo() {
}
@Transactional(propagation = REQUIRED)
public void bar() {
}
}
foo()
ybar()
comparte la misma transacción y si 1 falla, otro 1 también retrocederá? ¿Me puede dar alguna aclaración?@Transactional(propagation = REQUIRED)
método de capa DAO para la propagación y la@Transactional
capa de servicio, pero si pongo la@Transactional
capa de servicio solo en lugar de poner en la capa DAO, ¿cuál es la diferencia?propagation = REQUIRED
es el valor predeterminado para la propagación de anotaciones transaccionales, por lo que no es necesario escribirlo.Ignorando la primavera y los marcos en mi respuesta ... solo la idea básica de usar parámetros de función. Estoy seguro de que el concepto podría aplicarse dentro de [insertar marco aquí].
Debería manejar el commit / rollback fuera de los 2 métodos DAO. Los 2 métodos tendrían que tomar la transacción / conexión como entrada.
código psuedo:
fuente
Tran t
como parámetro con ambos métodos. ¿Puedes dar alguna explicación?Existe la posibilidad de que dos métodos funcionen de forma independiente y al mismo tiempo que se ejecute en una misma transacción. Por lo tanto, debemos usar Propagación requerida. Si la transacción tiene que ejecutarse en la misma transacción, usará la primera transacción; de lo contrario, se creará una nueva transacción si se invoca de forma independiente. Corrígeme si estoy equivocado.
fuente