2013-04-23 72 views
2

我想對PostgreSQL做一些基本的實驗,例如生成死鎖,創建不可重複的讀取等等。但我無法弄清楚如何一次運行多個事務看到這樣的行爲。 任何人都可以給我一些想法?如何在PostgreSQL中同時運行多個事務

+0

這取決於您使用的是哪個SQL客戶端。 – 2013-04-23 06:37:57

回答

7

打開多個psql會話,每個會話一個終端。

如果您在Windows上,可以通過多次啓動「開始」菜單啓動psql。在其他平臺上打開幾個新的終端或終端選項卡,並在每個平臺中啓動psql

我經常這樣做,當我檢查鎖定和併發的問題,答案一樣使用:

...可能更多。當您想要設置競賽條件時,一個有用的技巧是打開第三個psql會話和BEGIN; LOCK TABLE the_table_to_race_on;。然後在其他會話中運行語句;他們會阻止鎖。 ROLLBACK持有表鎖的交易和其他會話將會競賽。這並不完美,因爲它不能模擬偏移開始時併發性,但它仍然非常有用。

其他替代方法在this later answer中對相似主題進行了概述。

0

克雷格林格提供了一種方式,可以打開多個交易manualy,如果您發現不是很方便,您可以使用pgbench一次運行多個交易。

+0

起初我認爲這可能是一個簡潔的想法,但在閱讀pgbench的文檔時,我不明白它是如何響應OP試圖測試的條件:「死鎖,非重複讀取等」。我會去克雷格的方法。 – 2013-04-23 08:59:07

+0

通過這個稍後的答案,你也可以使用'src/test/isolation'中的isolationtester:http://stackoverflow.com/a/17055880/398670 – 2013-06-12 00:30:58

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; 

,並通過它與-f參數pgbench。

如需更詳細的pgbench使用我建議閱讀官方手冊 postgreSQL pgBench

,並與我pgbench問題resolved recently here得到acquented。

相關問題