Тестирование одновременных звонков в транзакционный сервис - PullRequest
2 голосов
/ 11 ноября 2009

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

Я установил тестовый класс JUnit с SpringJunit4ClassRunner, и компоненты @ autowired.

Просто порождение потоков, которые будут вызывать метод, похоже, не работает. Я не уверен, что это как-то связано с механизмом прокси Spring.

Чего я хотел бы добиться, так это создать ситуацию, когда два потока будут «внутри» тестируемого метода, а другой потерпит неудачу и произойдет откат. например Значение строки равно 3, и оба вызова метода пытаются уменьшить значение на 2; если метод не будет работать, значение будет -1, что недопустимо. Но я хочу, чтобы либо оба вызова потерпели неудачу и откат, либо произошел сбой того, который пытается обновить его на мгновение позже, чем другой.

Возможно ли это вообще?

1 Ответ

4 голосов
/ 11 ноября 2009

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

Код, который вы описали: чтение, декремент, запись работает только с правильным уровнем изоляции (сериализованное и повторяемое чтение будет работать).

После завершения этой настройки вы можете проверить поведение, заблокировав один поток, пока у него есть блокировка базы данных. Для этого вы можете использовать Latch .

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

...