надежно воспроизводит дб раздора - PullRequest
1 голос
/ 16 декабря 2009

мы сталкиваемся с некоторой регулярностью в таблице базы данных и хотели бы оценить ряд различных вариантов решения этой проблемы.

Для этого мне нужно воспроизвести в тестовом примере конфликт на столе (любой таблице) с повторяемой надежностью.

подход, который я рассматриваю, состоит в том, чтобы изменить семантику блокировки (например, java.util.concurrent.locks.ReentrantLock) и снять блокировку, когда начинается запись в таблицу, позволяя выполнять все чтения в то время, когда начинается запись.

Таким образом, один поток записи удерживает блокировку до того, как незадолго до выполнения вставки в таблицу, а затем освобождения блокировки, несколько потоков чтения будут пытаться выполнить операторы выбора для одной и той же таблицы.

Интересно, были ли какие-либо мысли о таком подходе или же существует более простой подход, который мог бы при 100% -ной достоверности воспроизвести раздор в таблице БД.

спасибо

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Вы можете использовать CountDownLatch со счетом 1.

final CountDownLatch barrier = new CountDownLatch(1);

Вы запускаете все темы чтения, первое действие которых

barrier.await();

тогда ветка писателя может

barrier.countDown();

В этот момент все читатели весело уйдут.

0 голосов
/ 16 декабря 2009

От вашей базы данных зависит, насколько легко вызвать в ней конфликт. Например, если вы используете Oracle, выполнение выбора никогда не приведет к конфликту.

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

Редактировать : Перечитав вопрос, я вижу, что вам кажется, что вас больше заботит состязание "читателя" в базе данных, чем состязание за обновление. Приведенную выше идею можно использовать для принудительной конкуренции за обновление, но не из-за читателя.

В случае, когда вы хотите запустить массовое число читателей, чтобы заполнить базу данных селектами, что не должно вызывать фактического конфликта, только голодание, тогда вы можете использовать CountDownLatch, как упомянуто в другом ответе, или сделать это старомодным способом с Object.wait / Object.notifyAll (), если вы вынуждены работать в JVM до 1.5.

Редактировать 2 : После прочтения комментария, вероятно, самый простой способ эмулировать возникшую конкуренцию - использовать команду таблицы блокировки Sybase . Просто заблокируйте стол, включите выбор и затем разблокируйте стол. Затем все выборки должны срабатывать ... это также имеет преимущество в том, что они наиболее точно подражают ситуации, которую вы пытаетесь смоделировать.

...