Nano Hash - криптовалюты, майнинг, программирование

Удаляет ли откат транзакции Hibernate объекты session.flush()?

Я был сбит с толку transaction.rollback. Вот пример псевдокода:

transaction = session.beginTransaction()    
EntityA a = new EntityA();    
session.save(a);    
session.flush();    
transaction.rollback();

Что происходит, когда этот код работает? У меня есть объект в базе данных или нет?

28.03.2012

Ответы:


1

Краткий ответ: нет, у вас не будет объекта в базе данных.

Более длинный ответ: спящий режим достаточно умен, чтобы не отправлять вставку/обновления в БД, пока не узнает, будет ли транзакция зафиксирована или отменена (хотя это поведение можно изменить, установив другой FlushMode), в вашем случае, вызвав flush вы заставляете SQL отправляться в БД, но у вас все еще есть транзакция БД, чтобы защитить вас, когда вы вызываете откат, транзакция БД будет откатываться, удаляя изменения, выполненные внутри нее, и, следовательно, ничего не будет фактически сохранено. Обратите внимание, что в зависимости от настроенного вами уровня изоляции транзакций, возможно, другие транзакции смогут каким-то образом увидеть объект EntityA, который вы сохранили на короткое время между сохранением и откатом. Также обратите внимание, что сброс вызывается автоматически при попытке чтения из БД, в 99% случаев явно вызывать его не нужно. Единственное исключение, которое приходит на ум, — это модульное тестирование с автоматическим откатом тестов.

28.03.2012
  • я не мог думать о транзакциях гибернации, которые каким-то образом напоминают реальную транзакцию БД. спасибо ! можно и этот вопрос проверить? что позвольте мне задать этот вопрос, что вы ответили. stackoverflow.com/ вопросы/9903872/ 28.03.2012
  • Эта часть ответа неверна: спящий режим достаточно умен, чтобы не отправлять вставки/обновления в БД, пока не узнает, будет ли транзакция зафиксирована или отменена. Hibernate БУДЕТ отправлять вставки/обновления в БД каждый раз, когда сеанс сбрасывается, и это может быть до того, как он узнает, должна ли транзакция быть зафиксирована или откатана. 05.11.2012
  • @SteveT знаете ли вы какой-нибудь сценарий, в котором сеанс будет очищен без вызова .flush() или фиксации транзакции? 07.11.2012
  • @ilcavero: зависит от режима очистки - в некоторых режимах Hibernate будет очищаться перед запросом. См. docs.jboss.org/hibernate/orm/3.6. /javadocs/org/hibernate/ для получения дополнительной информации. 12.12.2012
  • привет @ilcavero, будет ли такое же поведение, если я использую удаление вместо сохранения в приведенном выше коде? 04.01.2018
  • @dextermini да, это то же самое 04.01.2018

  • 2

    Когда вы вызываете session.save(a), Hibernate в основном запоминает где-то внутри сеанса, что этот объект должен быть сохранен. Он может решить, хочет ли он выдать INSERT INTO... немедленно, через некоторое время или при фиксации. Это улучшение производительности, позволяющее Hibernate выполнять пакетные вставки или избегать их, если транзакция откатывается.

    Когда вы вызываете session.flush(), Hibernate вынужден выдать INSERT INTO... базе данных. Сущность хранится в базе данных, но еще не зафиксирована. В зависимости от уровня изоляции транзакций он не будет виден другим запущенным транзакциям. Но теперь база данных знает о записи.

    Когда вы вызываете transaction.rollback(), Hibernate откатывает транзакцию базы данных. База данных обрабатывает откат, таким образом удаляя вновь созданный объект.

    Теперь рассмотрим сценарий без flush(). Во-первых, вы никогда не трогаете базу данных, поэтому производительность выше, а откат практически невозможен. С другой стороны, если уровень изоляции транзакции равен READ UNCOMMITTED, другие транзакции могут видеть вставленную запись даже до фиксации/отката. Без flush() этого не произойдет, если только Hibernate не решит flush() неявно.

    28.03.2012
  • Вы можете проверить мой другой вопрос, который заставил меня задать этот вопрос? stackoverflow.com/ вопросы/9903872/ 28.03.2012

  • 3

    Я думаю, вы запутались с flush и commit.

    flush() синхронизирует состояние с базой данных, но не выполняет фиксацию. Состояние по-прежнему видно по транзакции, так что вы можете вызывать откат к откату.

    Итак, ответ на ваш вопрос: нет, у вас нет сущности (а) в базе данных.

    28.03.2012
  • Спасибо тебе, друг. моя главная путаница заключалась в том, что мне не хватало знаний о реальной транзакции БД на сайте БД. 28.03.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..