2013-04-23 3 views
2

Я хочу сделать некоторый базовый эксперимент на PostgreSQL, например, для создания взаимоблокировок, для создания неповторяющихся чтений и т. Д. Но я не мог понять, как запускать сразу несколько транзакций см. такое поведение. Может ли кто-нибудь дать мне какую-нибудь идею?Как выполнять несколько транзакций одновременно в PostgreSQL

+0

Это зависит от того, какой клиент SQL вы используете. –

ответ

7

Открыть более одного psql сеанс, один терминал за сеанс.

Если вы находитесь в Windows, вы можете сделать это, запустив psql через меню «Пуск» несколько раз. На других платформах открывайте пару новых терминалов или терминальных вкладок и начинайте с psql.

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

... наверное, больше. Полезный трюк, когда вы хотите настроить условие гонки, - это открыть третью сессию psql и BEGIN; LOCK TABLE the_table_to_race_on;. Затем запустите операторы на других сеансах; они заблокируют замок. ROLLBACK сделка, удерживающая блокировку стола, и другие сессии будут гоняться. Это не идеально, поскольку он не имитирует параллелизм смещения-начала-времени, но он по-прежнему очень полезен.

Другие варианты указаны в this later answer по аналогичной теме.

0

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

+0

Сначала я подумал, что это может быть изящной идеей, но, читая документацию pgbench, мне не ясно, как она реагирует на условия, которые OP пытается проверить: «deadlocks, non-repeatble reads and etc.» Я пойду за подходом Крейга. –

+0

В этом более позднем ответе вы также можете использовать изолирующий элемент из 'src/test/isol': http://stackoverflow.com/a/17055880/398670 –

0

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

Чтобы получить dealocks вы можете просто щелкнуть правой некоторые сценарий, как это ('bench_script.sql):

DECLARE cnt integer DEFAULT 0; 
BEGIN; 
LOCK TABLE schm.tbl IN SHARE MODE; 
select count(*) from schm.tabl into cnt; 
insert into schm.tbl values (1 + 9999*random(), 'test descr'); 
END; 

и передать его в pgbench с -f параметра.

Для более детального использования pgbench я бы рекомендовал прочитать официальное руководство для postgreSQL pgBench

и получить acquented с моим pgbench вопрос resolved recently here.

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