Весенняя спящая транзакция

1

В документации говорится, что мы должны начать транзакцию, прежде чем делать какую-либо вставку. Но как работает код ниже? Потому что я вызываю 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)

И этот, как говорят, работает непереходным образом. что это значит?

Пожалуйста, помогите мне понять приведенные выше концепции

  • 0
    Я не имею ни малейшего понятия, что вы хотите с первой частью вашего вопроса. Вторая часть (относительно @Transactional ) будет работать только без транзакции, и, как только она обнаружит, что является частью транзакции, она выдаст исключение (как объяснено в справочном руководстве).
Теги:
spring
hibernate
spring-transactions

1 ответ

2
Лучший ответ

Как работает код ниже? Потому что я называю begintransaction после сохранения.

Hibernate не будет пытаться вставить/обновить базу данных сразу после вызова save(). Он попытается вставить только при попытке совершить транзакцию. Если вы не совершаете транзакцию, она не будет работать, как вы ожидаете.

@Transactional (распространение = распространение.NEVER), что это значит?

Ниже приведены 7 разных способов распространения транзакций, поддерживаемых Spring

  • PROPAGATION_REQUIRED (по умолчанию)
  • PROPAGATION_REQUIRED_NEW
  • PROPAGATION_SUPPORTS
  • PROPAGATION_NOT_SUPPORTED
  • PROPAGATION_MANDATORY
  • PROPAGATION_NEVER
  • PROPAGATION_NESTED

(Примечание: вам не нужно использовать транзакцию во всех ваших методах. У вас также может быть обычный метод без транзакции)

Чтобы выполнить метод в транзакции, аннотируйте его с помощью @Transactional. По умолчанию он работает в режиме PROPAGATION_REQUIRED, что означает одну из двух вещей

  1. Новая транзакция будет активирована, если в вызывающей программе нет существующей транзакции.
  2. Присоединитесь к существующей транзакции, если она уже активирована вызывающим абонентом.

Когда метод аннотируется с помощью @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
    }
}

Чтение вышеуказанного кода может дать лучшее понимание.

  • 0
    Спасибо за ваш ответ. Мне все еще не ясно со вторым ответом. Он работает без транзакции, значит, кто начнет транзакцию и совершит транзакцию? в настоящее время менеджер транзакций делает это. Но без транзакции, как это выполняется?
  • 0
    Я добавил больше деталей. Пожалуйста, проверьте, помогает ли это
Показать ещё 6 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню