setlayout create component java spring spring-mvc spring-transactions

java - create - setlayout jpanel



¿Cuál es la diferencia entre definir @Transactional en el método clase vs (4)

Citando de here

La recomendación del equipo de Spring es que solo anote las clases concretas con la anotación @Transactional, en lugar de anotar las interfaces.

Como este mecanismo se basa en proxies, solo se interceptarán las llamadas a métodos ''externos'' que entren a través del proxy. Esto significa que la "auto invocación", es decir, un método dentro del objeto objetivo que llama a otro método del objeto objetivo, no dará lugar a una transacción real en el tiempo de ejecución, incluso si el método invocado está marcado con @Transactional.

Caso 1

@Transactional public class UserServiceImpl implements UserService { ................... public void method1(){ try{ method2(); }catch(Exception e){ } } public void method2(){ } }

Case2

public class UserServiceImpl implements UserService { ................... public void method1(){ try{ method2(); }catch(Exception e){ } } @Transactional public void method2(){ } }

En caso 1 si ocurre alguna excepción, la reversión está funcionando, pero en el caso 2 no está funcionando. ¿Hay algún problema de rendimiento si sigo el caso1?


En caso de que 1 @Transactional se aplique a cada método individual. En el caso 2 @Transactional solo se aplica al método2 (), no en el método1 ()

Caso 1: - Invocar method1 () -> se inicia una transacción. Cuando method1 () llama a method2 () no se inicia ninguna transacción nueva, porque ya hay una

Caso 2: - Invocar method1 () -> no se inicia ninguna transacción. Cuando method1 () llama a method2 () NO se inicia ninguna transacción nueva. Esto se debe a que @Transactional no funciona cuando se llama a un método desde dentro de la misma clase. Funcionaría si llamaras a method2 () desde otra clase.

Del manual de referencia de primavera :

En el modo proxy (que es el predeterminado), solo se interceptan las llamadas a métodos externos que ingresan a través del proxy. Esto significa que la auto invocación, en efecto, un método dentro del objeto objetivo que llama a otro método del objeto objetivo, no conducirá a una transacción real en el tiempo de ejecución, incluso si el método invocado está marcado con @Transactional. Además, el proxy debe estar completamente inicializado para proporcionar el comportamiento esperado, por lo que no debe confiar en esta característica en su código de inicialización, es decir, @PostConstruct.


Supongamos que tiene la siguiente clase:

@Transactional(readOnly = true) public class DefaultFooService implements FooService { public Foo getFoo(String fooName) { // do something } // these settings have precedence for this method @Transactional(readOnly = false, propagation = Propagation.REQUIRES_NEW) public void updateFoo(Foo foo) { // do something } }

La anotación @Transactional en el nivel de clase se aplicará a todos los métodos de la clase.

Sin embargo , cuando un método se anota con @Transactional (como, updateFoo(Foo foo) ), esto tendrá prioridad sobre la configuración transaccional definida en el nivel de clase.

Más información:


@Transactional en una clase se aplica a cada método en el servicio. Es un atajo. Normalmente, puede establecer @Transactional(readonly = true) en una clase de servicio, si sabe que todos los métodos accederán a la capa de repositorio. A continuación, puede anular el comportamiento con @Transactional en los métodos que realizan cambios en su modelo. Problemas de rendimiento entre 1) y 2) no conocidos.