(...)
Необходимо рассмотреть еще много вопросов
когда вы вводите нетранзакционный
доступ к данным в вашем приложении. У нас
уже отметил, что введение нового
тип транзакции, а именно только для чтения
транзакции, может значительно
усложнять любые будущие модификации
ваше приложение. То же самое верно, если
Вы вводите нетранзакционный
операции.
Тогда у тебя будет три разных
виды доступа к данным в вашем
применение: в обычных транзакциях,
в транзакциях только для чтения, и теперь
также нетранзакционный, без
гарантии. Представь, что ты должен
ввести операцию, которая пишет
данные в единицу работы, которая была
должен только читать данные. Представить
что вы должны реорганизовать операции
которые были нетранзакционными, чтобы быть
транзакционный.
Мы не рекомендуем использовать
режим автоматической фиксации в приложении и
применять только операции чтения
когда есть очевидная производительность
выгода или когда будущие изменения кода
крайне маловероятно. Всегда предпочитаю
регулярные ACID транзакции для группы
ваши операции доступа к данным,
независимо от того, читаете ли вы или
записать данные.
Сказав это, Hibernate и Java
Настойчивость позволяет нетранзакционным
доступ к данным. На самом деле EJB 3.0
спецификация заставляет вас получить доступ
данные нетранзакционные, если вы хотите
реализовать атомную длительную
разговоры. Мы подойдем к этому
тема в следующей главе. Теперь мы
хочу копнуть немного глубже в
Последствия режима автоматической фиксации в
простое приложение Hibernate. (Заметка
что, несмотря на наши негативные замечания,
Есть несколько хороших вариантов использования для
режим автоматической фиксации. По нашему опыту
автокоммит часто включен для
неправильные причины, и мы хотели стереть
сначала сланец чистый.)
Работа без транзакций с Hibernate
Посмотрите на следующий код, который
обращается к базе данных без
границы транзакции:
Session session = sessionFactory.openSession();
session.get(Item.class, 123l);
session.close();
По умолчанию в среде Java SE
с конфигурацией JDBC, это
что произойдет, если вы выполните это
фрагмент кода:
- Открыт новый сеанс. Это не получает соединение с базой данных на этом
точка.
- Вызов get () запускает SQL SELECT. Сессия теперь получает JDBC
Соединение из пула соединений.
Hibernate, по умолчанию, сразу
отключает режим автоматической фиксации на этом
соединение с setAutoCommit (false).
Это эффективно запускает JDBC
сделка!
- SELECT выполняется внутри этой транзакции JDBC. Сессия
закрыто, и соединение возвращается
в бассейн и выпущен Hibernate
- Hibernate вызывает close () на JDBC
Подключение. Что происходит с
незафиксированная транзакция?
Ответ на этот вопрос таков:
зависит! »Спецификация JDBC
ничего не говорит об ожидании
транзакции при вызове close ()
связь. Что происходит, зависит от
как поставщики реализуют
Спецификация. С Oracle JDBC
водители, например, вызов
close () фиксирует транзакцию! Наиболее
другие поставщики JDBC выбирают вменяемый маршрут
и откатить любую ожидающую транзакцию
когда объект JDBC Connection
закрыт и ресурс возвращается
бассейн.
Очевидно, это не будет проблемой для ВЫБОРА, который вы выполнили (...)