2015-10-16 4 views

ответ

1

Хотя Hibernate явно не поддерживает вложенные транзакции, с помощью драйвера JDBC 3.0, который может создавать , точки сохранения могут достичь этого.

Создайте Connection в начале программы, когда создан SessionFactory. На этом этапе вы также создаете Savepoint, который служит отправной точкой для транзакции.

Затем вы перемещаете каждую вложенную транзакцию. Для каждой вложенной транзакции вы должны создать другую другую savePoint, то есть rollSavePoint, которую вы можете откат, если вложенная транзакция завершится с ошибкой. Затем для этой же вложенной транзакции откройте сеанс, который использует Connection, который вы создали в начале (i.e. Session nestedTransaction = SessionFactory.openSession(connection)), и сделайте свои обновления. Промойте сеанс и закройте его.

После завершения всех вложенных транзакций позвоните connection.commit(), чтобы совершить глобальную транзакцию и закрыть ее. Закройте sessionFactory как обычно и продолжайте делать все, что вам нужно.

Некоторые вещи, чтобы отметить:

  • Очевидно режим Autocommit должен быть выключен, в противном случае каждый раз, когда вы звоните вровень вы будете прямо совершали БД.
  • Если вы также выполняете поиск или другие операции, вы хотите открыть другие сеансы, которые используют свои собственные соединения. Убедитесь, что уровень изоляции транзакции установлен на READ_UNCOMMITED, иначе вы, вероятно, столкнетесь с проблемами блокировки.
  • Конечно, вы должны периодически совершать или у вашей базы данных проблемы, или вы можете увеличить размер виртуальной памяти базы данных.

Если вы используете весной вы также можете использовать родниковую Propagation.Check эту ссылку http://www.byteslounge.com/tutorials/spring-transaction-propagation-tutorial

Смежные вопросы