如何在PostgreSQL中同时运行多个事务

时间:2013-04-23 05:39:09

标签: postgresql

我想在PostgreSQL上做一些基本的实验,例如生成死锁,创建不可重复的读取等等。但是我无法弄清楚如何一次运行多个事务来查看这种行为。 谁能给我一些想法?

3 个答案:

答案 0 :(得分:7)

打开多个psql会话,每个会话一个终端。

如果您使用的是Windows,则可以多次通过“开始”菜单启动psql。在其他平台上打开几个新终端或终端选项卡,并在每个终端中启动psql

我在检查锁定和并发问题时经常这样做,在以下答案中使用:

......可能更多。想要设置竞争条件时,一个有用的技巧是打开第三个psql会话和BEGIN; LOCK TABLE the_table_to_race_on;。然后在其他会话中运行语句;他们会阻挡锁。 ROLLBACK持有表锁的事务和其他会话将竞争。它并不完美,因为它不会模拟偏移 - 启动时并发,但它仍然非常有用。

this later answer中列出了类似主题的其他替代方案。

答案 1 :(得分:1)

pgbench可能是你个案中最好的解决方案。它允许您测试不同的复杂数据库资源争用,死锁,多客户端,多线程访问。

要获得交易,您可以简单地使用这样的脚本('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

答案 2 :(得分:0)

Craig Ringer提供了一种手动打开多个交易的方法,如果您发现不方便,可以使用pgbench一次运行多个交易。

相关问题