Включить Autocommit для простых объектов данных Pojo? - PullRequest
0 голосов
/ 13 июня 2011

В моем приложении я скрыл базовые объекты хранилища за интерфейсами, что позволяет мне переключать хранилище по желанию.

Проблема заключается в том, что при тестировании hibernate кажется, что Hibernate очень ориентирован на транзакции.Все, что я мог найти по этому вопросу (в основном их официальные документы ), говорит о том, что автокоммит плох и его следует использовать редко.Однако все мое приложение написано не вокруг Hibernate, а вокруг интерфейсов.Это означает, что получение данных из базы данных происходит одним способом (например, getObjects () на фабрике), а не транзакцией.

Поскольку я абстрагировал реализацию хранилища, является ли автокоммит правильным решением?Или есть альтернатива?

Ответы [ 2 ]

1 голос
/ 14 июня 2011

Использование автоматической фиксации не означает, что транзакции больше не используются для доступа к данным. Это просто означает, что каждый оператор теперь выполняется в своей собственной транзакции. Точные случаи, когда транзакция начинается и заканчивается, определены в спецификации JDBC. Для краткости это обычно зависит от характера выполняемого оператора.

Я не уверен, как реализован ваш дизайн, но нетранзакционные системы обычно страдают от трех проблем. Использование автоматической фиксации может привести к повторному появлению одной или нескольких из этих проблем.

Грязные чтения

Рассмотрим поток A в вашем приложении, который считывает сущность и обновляет ее, но не фиксирует новое значение. Рассмотрим другой поток B, который читает ту же сущность и видит обновленное значение. Если поток A должен был откатить свои изменения или потерпеть неудачу при фиксации обновленного значения, то B, по сути, использует грязное значение, поскольку он выполнял грязное чтение.

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

Неповторяемые чтения

В контексте транзакции чтение одной и той же сущности (записи) дважды в контексте транзакции и просмотр другого значения во втором чтении считается неповторяемым чтением. Это происходит, когда другая транзакция зафиксировала свое изменение, а текущая транзакция считывает новое значение.

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

Фантомные чтения

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

Аналогично, использование автоматической фиксации, скорее всего, приведет к фантомному чтению в вашем приложении по тем же причинам.

Эти проблемы также будут зависеть от используемых уровней изоляции транзакций базы данных, но в конечном итоге, когда кто-либо использует инфраструктуру ORM, маркировка начала и конца транзакций будет оставлена ​​разработчику приложения. Хотя отдельные операции чтения-записи могут быть изолированы друг от друга базой данных, разработчик должен убедиться, что работа происходит в транзакционном контексте. Использование автоматической фиксации изменяет контекст транзакции для каждой операции.

TLDR

Использование автоматической фиксации при выполнении транзакций означает, что невозможно выполнить откат до безопасного состояния в случае сбоя во время «контекста бизнес-транзакции». Кроме того, именно по этой причине автоматическая фиксация должна быть отключена при выполнении пакетных обновлений в JDBC. Использование автоматической фиксации приведет к тому, что фиксация будет происходить для каждого обновления в пакете, когда реальная необходимость - это фиксация в конце пакета.

Я бы рекомендовал прочесть книгу Стратегии проектирования транзакций Java (доступна в виде бесплатной электронной книги), чтобы получить более полное представление об использовании транзакций.

0 голосов
/ 13 июня 2011

Конечно, есть свойство 'hibernate.connection.autocommit', которое вы можете установить в значение true либо в своем XML-файле конфигурации hibernate, либо программно в своей SessionFactory.

Из вашего вопроса неясно, какая выгода это даст.действительно предлагаем вам начать и совершить транзакцию внутри реализации Hibernate метода интерфейса getObjects(.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...