Подтвердить что ты не робот

Когда использовать Spring @Transactional (распространение = Распространение .SUPPORTS)?

В соответствии с Spring javadoc @Transactional(propagation = Propagation.SUPPORTS)

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

Кажется, что я могу просто объявить методы не транзакционно и просто сделать с ним, чтобы мои вопросы были.

  • Каковы ситуации, в которых требуется распространение SUPPORTS?
  • В чем смысл поддержки распространения?

Может ли кто-нибудь дать пример/сценарий реального мира, где SUPPORTS был действительно полезен?

4b9b3361

Ответ 1

Самый простой пример, который я могу представить, - это метод, который отправляет некоторый контент на сервер JMS. Если вы находитесь в контексте транзакции, вы хотите, чтобы сообщение было привязано к области транзакций. Но если транзакция еще не запущена, зачем также звонить на сервер транзакций и запускать одно, чтобы сделать одноразовое сообщение?

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

Это, конечно, в контексте JTA. Эта функция практически не имеет практического применения в системе, где транзакции ограничены транзакциями физической базы данных с ресурсами.

Ответ 2

Он делает хорошую пару вместе с флагом readOnly=true Transactional при операции выбора, особенно когда используется ORM:

@Transactional(readOnly = true, propagation=Propagation.SUPPORTS)
public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}

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

Хотя, если вы уже были в этом процессе мышления, вы даже можете рассмотреть вопрос об аспекте транзакции:

public Pojo findPojo(long pojoId) throws Exception {
   return em.find(Pojo.class, pojoId);
}

Ответ 3

В соответствии с этими проблемами Повысить производительность с помощью Propagation.SUPPORTS для операции readOnly, вы не должны устанавливать транзакцию только для чтения с помощью Propagation.SUPPORTS:

Отнюдь не ясно, что это изменение действительно улучшит производительность. В этом есть несколько аспектов. Первое из них заключается в том, что связанная статья датирована и невероятно испорчена, поскольку она агрессивно упрощает вещи. Я могу вдаваться в подробности, если вы хотите, но я оставлю это на этом пока. Здесь много чего играет в исполнении. Без выполнения транзакции ни один флаг readOnly не распространяется на драйвер JDBC (что может привести к оптимизации для большого количества баз данных, которые не применяются), и вы не применяете оптимизацию в коде управления ресурсами Spring JPA, как явно отключая промывку, что - если применяется - может значительно повысить производительность, если вы прочитали много данных.