Spring: разница между методом с @Transactional (распространение = Propagation.SUPPORTS) и без @Transactional - PullRequest
2 голосов
/ 23 сентября 2019

В чем разница между методом с @Transactional(propagation = Propagation.SUPPORTS) и без @Transactional аннотаций вообще?

@Transactional(propagation = Propagation.SUPPORTS)
public void MyMethod()

против

public void MyMethod()

Не один либез аннотации также использовать транзакцию, если она уже открыта, в противном случае продолжить без какой-либо транзакции?

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Да, одна без каких-либо аннотаций будет использовать существующую транзакцию, если она уже открыта, но, если ее нет, вы не захотите отменить изменения, если ваша транзакция не удалась.

Распространение имеет и другой атрибут, имеющийхорошо, если ваш метод не зависит от родительской транзакции и выполняется в отдельной области транзакции, вероятно, вы можете пойти на REQUIRES_NEW таким образом, вы можете иметь независимую транзакцию для вашего метода.

0 голосов
/ 23 сентября 2019
  1. Метод с аннотацией @Transactional:

    • Если вы аннотировали метод с помощью @Transactional, то этот метод выполняется водна транзакция базы данных.

Например:

Если у вас есть такой код:

@Service
public class UserDAOImpl implements UserDAO { 

    @PersistenceContext 
    private EntityManager em; 

    @Transactional   
    public void createUser(User user) { 
        em.persist(user);    
    }
}

В этом случае что происходит?- JPA содержит @PersistenceContext, который загружает EntityManager из контейнера. Затем @Transactional поддерживаетвся сделка сама по себе.Вам не нужно вручную запускать и завершать транзакцию.

Теперь, если вы используете это (propagation = Propagation.SUPPORTS) с @Transactional, то, что происходит в этом случае, это itустанавливает область действия транзакции, чтобы проверить, существует ли какая-либо текущая транзакция или нет.Если не текущая транзакция, то метод будет выполняться в нетранзакционном способе. 1045


Метод без аннотации @Transactional:

  • В этом случае вам придется управлять транзакцией вручную.

Например:

Если у вас есть такой код:

 // add the persistence unit name  
 EntityManagerFactory emf = Persistence.createEntityManagerFactory("demo");
 EntityManager em = emf.createEntityManager();
 em.getTransaction().begin();
 User user = new User();
 user.setName("Michael");
 user.setAge("23");
 em.persist(user);
 em.getTransaction().commit();

В этом случаеВы должны получить боб вручную.Затем вы должны начать транзакцию и завершить транзакцию.В этом много работы.

С @Transactional(propagation = Propagation.SUPPORTS), транзакция может управляться контейнером , тогда как без @Transactional, контейнер не будетвообще управлять транзакцией .

0 голосов
/ 23 сентября 2019

По вашей ссылке указано, что Propagation.SUPPORTS может повлиять на синхронизацию:

SUPPORTS немного отличается от отсутствия транзакции вообще,так как определяет область транзакции, к которой будет применяться синхронизация .Как следствие, одни и те же ресурсы (соединение JDBC, сеанс Hibernate и т. Д.) Будут совместно использоваться для всей указанной области действия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...