В документации говорится, что мы должны начать транзакцию, прежде чем делать какую-либо вставку. Но как работает код ниже? Потому что я вызываю beginTransaction() после сохранения.
@Override
public void insertCustomer(Employees employee) {
Session session = sessionFactory.openSession();
session.save(employee);
session.beginTransaction();
session.getTransaction().commit();
session.close();
}
И у меня есть еще одно сомнение в атрибуте Spring @transactional, называемом распространением, который можно настроить, как показано ниже,
@Transactional(propagation=Propagation.NEVER)
И этот, как говорят, работает непереходным образом. что это значит?
Пожалуйста, помогите мне понять приведенные выше концепции
Как работает код ниже? Потому что я называю begintransaction после сохранения.
Hibernate не будет пытаться вставить/обновить базу данных сразу после вызова save()
. Он попытается вставить только при попытке совершить транзакцию. Если вы не совершаете транзакцию, она не будет работать, как вы ожидаете.
@Transactional (распространение = распространение.NEVER), что это значит?
Ниже приведены 7 разных способов распространения транзакций, поддерживаемых Spring
(Примечание: вам не нужно использовать транзакцию во всех ваших методах. У вас также может быть обычный метод без транзакции)
Чтобы выполнить метод в транзакции, аннотируйте его с помощью @Transactional
. По умолчанию он работает в режиме PROPAGATION_REQUIRED, что означает одну из двух вещей
Когда метод аннотируется с помощью @Transaction(prorogation=Propagation.NEVER)
он не должен вызываться другим способом с активной транзакцией. В противном случае будет выбрано исключение.
Propagation.NEVER
используется, когда вы хотите, чтобы конкретная логика/метод выполнялась строго без активной транзакции. По моему опыту, я никогда не использовал этот атрибут. 95% времени вы будете удовлетворены поведением PROPAGATION_REQUIRED
по умолчанию. Однако хорошо иметь знания о разных поведении.
Позвольте мне объяснить на примере:
@Component
public class TransactionTutorial {
@Transactional
public void aboutRequired() {
//This method will create a new transaction if it is called with no active transaction
//Some logic that should be executed within a transaction
//normal() method will also run under the newly created transaction.
normal();
//An exception will be thrown at this point
//because aboutNever() is marked as Propagation.NEVER
aboutNever();
}
@Transactional(propagation=Propagation.NEVER)
public void aboutNever() {
//This method should be called without any active transaction.
//If it is called under active transaction, exception will occur.
//Some logic that should be executed without a transaction.
}
public void normal() {
//This method is not bothered about surrounding transaction.
//You can call this method with or without an active transaction.
//Some logic
}
}
Чтение вышеуказанного кода может дать лучшее понимание.
@Transactional
) будет работать только без транзакции, и, как только она обнаружит, что является частью транзакции, она выдаст исключение (как объяснено в справочном руководстве).