Метод с аннотацией @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
, контейнер не будетвообще управлять транзакцией .