
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
04.12.2014, 03:33
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Есть сервис который выполняет длительную работу с БД. В нем есть метод Код: java 1. 2. 3. 4. То бишь на каждое действие новая транзакция. Все работает отлично. Но есть тест покрывающий этот метод. В нем используется hsqldb in memory. Сам тест тоже помечен @Transactional. Код: java 1. 2. 3. 4. 5. 6. 7. Перед запуском теста, в БД вставляется несколько тестовых записей. ID Которых потом передается в сервис, он достает нужную запись из БД и обрабатывает. Так вот, проблема в том, что внутри метода service.doWork(data) не видно данные добавленные перед тестом. Если заменить @Transactional(propagation = Propagation.REQUIRES_NEW) на @Transactional То все работает как надо, но тогда все выполняется в одной транзакции и жутко тормозит. getSession().flush() - не помогает. Уже всю голову сломал почему данные из вложенной транзакции не видны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 03:47
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Бегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях. Почему, собственно, вы решили, что они поддерживаются и должны работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 04:05
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Basil A. SidorovБегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях. Почему, собственно, вы решили, что они поддерживаются и должны работать? Ну например потому, что в данном примере нет вложенных транзакций. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 04:32
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий ЗнанияНу например потому, что в данном примере нет вложенных транзакций. REQUIRES_NEW . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 12:35
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Basil A. Sidorov, Почитай как оно работает. Это не вложенные транзакции получаются. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 12:41
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий Знания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 отношения не имееют. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 13:26
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий ЗнанияBasil A. Sidorov, Почитай как оно работает. Это не вложенные транзакции получаются.А что же это тогда? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 13:37
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
DEVcoachА что же это тогда? http://www.jroller.com/dancruz/entry/spring_nested_transactions savepoint? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 16:17
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий ЗнанияПочитай как оно работает. Это не вложенные транзакции получаются.Именно. Если база не умеет вложенных транзакций, но допускает два подряд begin transaction, то мы получаем две независимые транзакции, каждая из которых может видеть данные "соседки" только в результате грязного чтения. А этот дефект исправлен во второй версии HSQLDB. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 16:27
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Basil A. SidorovИменно. Если база не умеет вложенных транзакций, но допускает два подряд begin transaction, то мы получаем две независимые транзакции, каждая из которых может видеть данные "соседки" только в результате грязного чтения. А этот дефект исправлен во второй версии HSQLDB. По-моему там ещё нужно смотреть чтобы Transaction Manager правильный API использовал для желаемого эффекта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 16:35
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Basil A. SidorovБегло пробежался по сайту HyperSQL и не нашёл ни слова о вложенных транзакциях. Почему, собственно, вы решили, что они поддерживаются и должны работать? Блин. Вот вы меня запутали. PROPAGATION_NESTED это вложеная. REQUIRES_NEW это независимая. Логично что она не видит верхней транзакции, так как та ещё незакомичена Ищущий Знания, Найди способ, либо зарефакторь так чтобы коммит теста происходил до запуска doWork(). Либо, если у тебя все тесты должны откатиться, то выхода кроме запуска в той же транзакции нет. Можно игнорировать REQUIRES_NEW, если очень хочется, через свой TransactionManager. На и над тестом надо подумать. Потому что, если тестовые данные не комитить, а потом их интенсивно использовать, то естественно будет тормозить при любом раскладе. Возможно проще подчищать после теста, но комитить? HSQL же в памяти. Дропнул и всего делов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 17:13
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Вот-вот: идея помечать тестирующий метод как транзакционный - странная, мягко говоря. Если тестовые данные нужны постоянно - создали базу с этими данными в начале тестирования и дропнули всё в конце. Если разным тестам нужны разные данные, то вставили нужное, прогнали тестируемые методы и удалили вставленное. Перешли на следующий этап. Где можно увидеть смысл автоматизации транзакций для тестирующих методов - остаётся для меня загадкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
04.12.2014, 23:11
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Basil A. SidorovВот-вот: идея помечать тестирующий метод как транзакционный - странная, мягко говоря. Ничего странного в ней нет. Как вы будете работать с базой без транзакций-то? Самый простой путь это использовать возможности спринга для управления ими, все равно же спринг используется. Вот и помечается метод как транзакционный. Basil A. SidorovЕсли тестовые данные нужны постоянно - создали базу с этими данными в начале тестирования и дропнули всё в конце. Если разным тестам нужны разные данные, то вставили нужное, прогнали тестируемые методы и удалили вставленное. Перешли на следующий этап. Это если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост) Возиться с реальной базой это гемор. Чистить, наполнять, поддерживать актуальную схему и т.д. При тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой. Получается на много быстрее и эффективнее. Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать. Как это сделать без транзакций-то? Вот тут и напоролся на особенность этой БД. Думал может есть варианты малой кровью, оказалось что нет. Пришлось руками разводить транзакции, а не полагаться на автоматику. Basil A. SidorovГде можно увидеть смысл автоматизации транзакций для тестирующих методов - остаётся для меня загадкой. Смысл легко можно увидеть, если попытаться потестировать свое приложение. В тесте 2 метода, в одном в базу добавляются какие-то данные, в другом работает тест с этими данными. Вот и есть 2 транзакции, которые в том же постгри нормально разводятся сами, автоматически. Достаточно пометить методы как транзакционные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.12.2014, 08:22
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий ЗнанияНичего странного в ней нет. Как вы будете работать с базой без транзакций-то?Не надо заниматься преждевременной оптимизацией - транзакцию начинают DDL/DML операторы.Это если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост)Вы не правы по обоим пунктам своих предположений.Возиться с реальной базой это гемор. Чистить, наполнять, поддерживать актуальную схему и т.д. При тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой. Получается на много быстрее и эффективнее.Пока - понятные и общеизвестные банальности.Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать. Как это сделать без транзакций-то?Если не заниматься преждевременной оптимизацией? Очень просто: 0. Создание базы; 1. Пачка DDL; 2. Фиксация (commit). Не требуется, если установлен или действует autocommit; 3. Пачка DML; 4. См. п.2; 5. Тестирование. Вот здесь можем развлекаться со всем, включая декларативное и ручное управление транзакциями; 6. Проверка результата и отчёт; 7. Удаление базы или отдельных таблиц, если собираемся что-то переиспользовать в других тестах. Где в этой цепочке есть не то чтобы нужность, где хотя бы полезность управления транзакциями на уровне контейнера/приложения для тестирующего метода??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
05.12.2014, 09:05
|
|||
|---|---|---|---|
|
|||
junit hibernate hsqldb проблемы с транзакциями |
|||
|
#18+
Ищущий ЗнанияЭто если вы в криокамере просидели последние несколько лет или не прочитали мой первый пост) Хамство своё попридержите. Потому что похоже что в этом топике как раз вы меньше всего понимаете зачем вам именно транзакция и почему одна транзакция вдруг не видет содержимое другой. Ваш вопрос ведь только к этому сводится. Ищущий ЗнанияПри тестировании сервисов очень часто используют так называемую In memory data base, чтобы не возится с реальной базой. Получается на много быстрее и эффективнее. Теперь дальше, "то вставили нужное, прогнали тестируемые методы и удалили вставленное", именно это я и хочу сделать. Как это сделать без транзакций-то? Правильно. Вот только не понятно нафига тогда in-memory база, если ты боишься в неё комитить? Не бойся. "Без транзакции" и "не комитить транзакцию" это разные вещи. Внешняя транзакция не закомичена, вот и не видно данных. Но так как это всего лишь тест, можно её смело комитить. Запускать транзакционный метод на тестирование. И в конце дропать in-memory базу. Ищущий ЗнанияВот тут и напоролся на особенность этой БД. Думал может есть варианты малой кровью, оказалось что нет. Пришлось руками разводить транзакции, а не полагаться на автоматику. То что одна транзакция по-умолчанию не видит другую это не особенность HSQLDB. Это во всех базах так. Ищущий ЗнанияВ тесте 2 метода, в одном в базу добавляются какие-то данные, в другом работает тест с этими данными. Ну, так ЗАКОМИТЬ первые тестовые данные. А потом с ними работай. Где комит? Ищущий ЗнанияВот и есть 2 транзакции, которые в том же постгри нормально разводятся сами, автоматически. Достаточно пометить методы как транзакционные. В такой терминологии на пальцах как "разводятся" и "сами" транзакции не описывают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=59&tablet=1&tid=2126133]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
44ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 225ms |
| total: | 360ms |

| 0 / 0 |
