2009-11-11 6 views
2

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

У меня есть тестовый класс JUnit с SpringJunit4ClassRunner, а компоненты @autowired.

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

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

Возможно ли это?

+0

Вы должны точно объяснить, что не работает при нерестах потоков. – tangens

+0

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

ответ

4

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

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

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

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

+0

Звучит так, что я хотел. Я постараюсь посмотреть, все ли на работу. Спасибо! – egaga

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