Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / junit hibernate hsqldb проблемы с транзакциями / 15 сообщений из 15, страница 1 из 1
04.12.2014, 03:33
    #38824367
junit hibernate hsqldb проблемы с транзакциями
Есть сервис который выполняет длительную работу с БД.
В нем есть метод
Код: java
1.
2.
3.
4.
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doWork(String data) {
...
}


То бишь на каждое действие новая транзакция.
Все работает отлично.
Но есть тест покрывающий этот метод.
В нем используется hsqldb in memory.
Сам тест тоже помечен @Transactional.
Код: java
1.
2.
3.
4.
5.
6.
7.
@Test
@Transactional
public void testDoWork() {
...
  service.doWork(data);
...
}


Перед запуском теста, в БД вставляется несколько тестовых записей.
ID Которых потом передается в сервис, он достает нужную запись из БД и обрабатывает.

Так вот, проблема в том, что внутри метода service.doWork(data)
не видно данные добавленные перед тестом.
Если заменить @Transactional(propagation = Propagation.REQUIRES_NEW) на @Transactional
То все работает как надо, но тогда все выполняется в одной транзакции и жутко тормозит.
getSession().flush() - не помогает.
Уже всю голову сломал почему данные из вложенной транзакции не видны.
...
Рейтинг: 0 / 0
04.12.2014, 03:47
    #38824372
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Бегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях.
Почему, собственно, вы решили, что они поддерживаются и должны работать?
...
Рейтинг: 0 / 0
04.12.2014, 04:05
    #38824379
junit hibernate hsqldb проблемы с транзакциями
Basil A. SidorovБегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях.
Почему, собственно, вы решили, что они поддерживаются и должны работать?

Ну например потому, что в данном примере нет вложенных транзакций.
...
Рейтинг: 0 / 0
04.12.2014, 04:32
    #38824388
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияНу например потому, что в данном примере нет вложенных транзакций. REQUIRES_NEW .
...
Рейтинг: 0 / 0
04.12.2014, 12:35
    #38824739
junit hibernate hsqldb проблемы с транзакциями
Basil A. Sidorov,

Почитай как оно работает. Это не вложенные транзакции получаются.
...
Рейтинг: 0 / 0
04.12.2014, 12:41
    #38824743
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияBasil A. Sidorov,

Почитай как оно работает. Это не вложенные транзакции получаются.

Что-то я в вашем диалоге запутался. Итого имеем
1) Маловероятно что HSQL поддерживает вложеные транзакции.
2) Из-за п1 REQUIRES_NEW говорит контейнеру создать новую транзакцию. Откат\комит которой не повлияет на откат\комит внешней транзакции.

Внимание вопрос. С какого перепугу новая транзакция должна видеть старую, если они обе не закомичены?
Ну, и собственно ответ
http://en.wikipedia.org/wiki/Isolation_(database_systems)
http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/transaction/annotation/Isolation.html

И, это же спринговые ассоциации. Они к Hibernate отношения не имееют.
...
Рейтинг: 0 / 0
04.12.2014, 13:26
    #38824809
DEVcoach
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияBasil A. Sidorov,
Почитай как оно работает. Это не вложенные транзакции получаются.А что же это тогда?
...
Рейтинг: 0 / 0
04.12.2014, 13:37
    #38824827
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
DEVcoachА что же это тогда?
http://www.jroller.com/dancruz/entry/spring_nested_transactions
savepoint?
...
Рейтинг: 0 / 0
04.12.2014, 16:17
    #38825114
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияПочитай как оно работает. Это не вложенные транзакции получаются.Именно.
Если база не умеет вложенных транзакций, но допускает два подряд begin transaction, то мы получаем две независимые транзакции, каждая из которых может видеть данные "соседки" только в результате грязного чтения. А этот дефект исправлен во второй версии HSQLDB.
...
Рейтинг: 0 / 0
04.12.2014, 16:27
    #38825132
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Basil A. SidorovИменно.
Если база не умеет вложенных транзакций, но допускает два подряд begin transaction, то мы получаем две независимые транзакции, каждая из которых может видеть данные "соседки" только в результате грязного чтения. А этот дефект исправлен во второй версии HSQLDB.
По-моему там ещё нужно смотреть чтобы Transaction Manager правильный API использовал для желаемого эффекта.
...
Рейтинг: 0 / 0
04.12.2014, 16:35
    #38825144
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Basil A. SidorovБегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях.
Почему, собственно, вы решили, что они поддерживаются и должны работать?
Блин. Вот вы меня запутали. PROPAGATION_NESTED это вложеная. REQUIRES_NEW это независимая. Логично что она не видит верхней транзакции, так как та ещё незакомичена

Ищущий Знания,

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

На и над тестом надо подумать. Потому что, если тестовые данные не комитить, а потом их интенсивно использовать, то естественно будет тормозить при любом раскладе. Возможно проще подчищать после теста, но комитить? HSQL же в памяти. Дропнул и всего делов.
...
Рейтинг: 0 / 0
04.12.2014, 17:13
    #38825196
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Вот-вот: идея помечать тестирующий метод как транзакционный - странная, мягко говоря.
Если тестовые данные нужны постоянно - создали базу с этими данными в начале тестирования и дропнули всё в конце.
Если разным тестам нужны разные данные, то вставили нужное, прогнали тестируемые методы и удалили вставленное. Перешли на следующий этап.
Где можно увидеть смысл автоматизации транзакций для тестирующих методов - остаётся для меня загадкой.
...
Рейтинг: 0 / 0
04.12.2014, 23:11
    #38825579
junit hibernate hsqldb проблемы с транзакциями
Basil A. SidorovВот-вот: идея помечать тестирующий метод как транзакционный - странная, мягко говоря.
Ничего странного в ней нет. Как вы будете работать с базой без транзакций-то?
Самый простой путь это использовать возможности спринга для управления ими, все равно же спринг используется.
Вот и помечается метод как транзакционный.

Basil A. SidorovЕсли тестовые данные нужны постоянно - создали базу с этими данными в начале тестирования и дропнули всё в конце.
Если разным тестам нужны разные данные, то вставили нужное, прогнали тестируемые методы и удалили вставленное. Перешли на следующий этап.
Это если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост)
Возиться с реальной базой это гемор. Чистить, наполнять, поддерживать актуальную схему и т.д.
При тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой.
Получается на много быстрее и эффективнее.
Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать.
Как это сделать без транзакций-то?
Вот тут и напоролся на особенность этой БД. Думал может есть варианты малой кровью, оказалось что нет.
Пришлось руками разводить транзакции, а не полагаться на автоматику.

Basil A. SidorovГде можно увидеть смысл автоматизации транзакций для тестирующих методов - остаётся для меня загадкой.
Смысл легко можно увидеть, если попытаться потестировать свое приложение.
В тесте 2 метода, в одном в базу добавляются какие-то данные, в другом работает тест с этими данными.
Вот и есть 2 транзакции, которые в том же постгри нормально разводятся сами, автоматически.
Достаточно пометить методы как транзакционные.
...
Рейтинг: 0 / 0
05.12.2014, 08:22
    #38825679
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияНичего странного в ней нет. Как вы будете работать с базой без транзакций-то?Не надо заниматься преждевременной оптимизацией - транзакцию начинают DDL/DML операторы.Это если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост)Вы не правы по обоим пунктам своих предположений.Возиться с реальной базой это гемор. Чистить, наполнять, поддерживать актуальную схему и т.д.
При тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой.
Получается на много быстрее и эффективнее.Пока - понятные и общеизвестные банальности.Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать.
Как это сделать без транзакций-то?Если не заниматься преждевременной оптимизацией? Очень просто:
0. Создание базы;
1. Пачка DDL;
2. Фиксация (commit). Не требуется, если установлен или действует autocommit;
3. Пачка DML;
4. См. п.2;
5. Тестирование. Вот здесь можем развлекаться со всем, включая декларативное и ручное управление транзакциями;
6. Проверка результата и отчёт;
7. Удаление базы или отдельных таблиц, если собираемся что-то переиспользовать в других тестах.
Где в этой цепочке есть не то чтобы нужность, где хотя бы полезность управления транзакциями на уровне контейнера/приложения для тестирующего метода???
...
Рейтинг: 0 / 0
05.12.2014, 09:05
    #38825707
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
junit hibernate hsqldb проблемы с транзакциями
Ищущий ЗнанияЭто если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост)

Хамство своё попридержите. Потому что похоже что в этом топике как раз вы меньше всего понимаете зачем вам именно транзакция и почему одна транзакция вдруг не видет содержимое другой. Ваш вопрос ведь только к этому сводится.

Ищущий ЗнанияПри тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой.
Получается на много быстрее и эффективнее.
Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать.
Как это сделать без транзакций-то?

Правильно. Вот только не понятно нафига тогда in-memory база, если ты боишься в неё комитить? Не бойся. "Без транзакции" и "не комитить транзакцию" это разные вещи. Внешняя транзакция не закомичена, вот и не видно данных. Но так как это всего лишь тест, можно её смело комитить. Запускать транзакционный метод на тестирование. И в конце дропать in-memory базу.

Ищущий ЗнанияВот тут и напоролся на особенность этой БД. Думал может есть варианты малой кровью, оказалось что нет.
Пришлось руками разводить транзакции, а не полагаться на автоматику.

То что одна транзакция по-умолчанию не видит другую это не особенность HSQLDB. Это во всех базах так.


Ищущий ЗнанияВ тесте 2 метода, в одном в базу добавляются какие-то данные, в другом работает тест с этими данными.
Ну, так ЗАКОМИТЬ первые тестовые данные. А потом с ними работай. Где комит?

Ищущий ЗнанияВот и есть 2 транзакции, которые в том же постгри нормально разводятся сами, автоматически.
Достаточно пометить методы как транзакционные.
В такой терминологии на пальцах как "разводятся" и "сами" транзакции не описывают.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / junit hibernate hsqldb проблемы с транзакциями / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]