Como saben muchos cuando utiliza un objeto proxy, como cuando crea un bean con atributos transaccionales para Spring/EJB o incluso cuando crea un simulacro parcial con algunos frameworks, el objeto proxies no lo sabe, y las llamadas internas son no redirigida, y luego no sea interceptado ...¿Cómo manejar llamadas internas en Spring/EJB/Mockito ... proxies?
es por eso que si lo hace algo así en primavera:
@Transactionnal
public void doSomething() {
doSomethingInNewTransaction();
doSomethingInNewTransaction();
doSomethingInNewTransaction();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomethingInNewTransaction() {
...
}
Cuando se llama a doSomething, que espera tener 3 nuevas transacciones, además de la principal uno, pero en realidad, debido a este problema, solo obtienes uno ...
así que me pregunto ¿cómo se hace para manejar este tipo de problemas ...
estoy realmente en una situación en la que tengo que manejar un sistema transaccional compleja, y no veo ninguna manera mejor que dividiendo mi servicio en muchos servicios pequeños, por lo que estoy seguro de pasar por todos los servidores proxy ...
Eso me molesta mucho porque todo el código pertenece al mismo dominio funcional y no debe dividirse ...
He encontrado esta pregunta relacionada con las respuestas interesantes: Spring - @Transactional - What happens in background?
Rob H dice que podemos inyectar el proxy de primavera dentro del servicio y llamar a proxy.doSomethingInNewTransaction(); en lugar. Es bastante fácil de hacer y funciona, pero no me gusta mucho ...
Yunfeng Hou dice esto:
Así que escribir mi propia versión de CglibSubclassingInstantiationStrategy y proxy de modo que el creador utilizará CGLIB para generar una subclase real que los delegados llaman a su super en lugar de otra instancia, que Spring está haciendo ahora. Así que puedo anotar libremente sobre cualquier método (tan largo como ya que no es privado), y desde cualquier lugar que llame a estos métodos, se ocuparán de . Bueno, todavía tengo que pagar el precio: 1. Debo enumerar todas las anotaciones que deseo habilitar para la creación de la nueva clase CGLIB . 2. No puedo hacer anotaciones sobre un método final ya que ahora estoy generando la subclase, por lo que no se puede interceptar un método final.
¿Qué quiere decir con "which spring is doing now"? ¿Esto significa que las llamadas transaccionales internas ahora se interceptan?
¿Qué crees que es mejor?
¿Divide sus clases cuando necesita cierta granularidad transaccional? ¿O usa alguna solución como la de arriba? (por favor, compártelo)
¿no hay más ideas? por favor, estoy seguro de que ya vio este problema. –