我想在PostgreSQL上做一些基本的实验,例如生成死锁,创建不可重复的读取等等。但是我无法弄清楚如何一次运行多个事务来查看这种行为。 谁能给我一些想法?
答案 0 :(得分:7)
打开多个psql
会话,每个会话一个终端。
如果您使用的是Windows,则可以多次通过“开始”菜单启动psql
。在其他平台上打开几个新终端或终端选项卡,并在每个终端中启动psql
。
我在检查锁定和并发问题时经常这样做,在以下答案中使用:
......可能更多。想要设置竞争条件时,一个有用的技巧是打开第三个psql
会话和BEGIN; LOCK TABLE the_table_to_race_on;
。然后在其他会话中运行语句;他们会阻挡锁。 ROLLBACK
持有表锁的事务和其他会话将竞争。它并不完美,因为它不会模拟偏移 - 启动时并发,但它仍然非常有用。
this later answer中列出了类似主题的其他替代方案。
答案 1 :(得分:1)
要获得交易,您可以简单地使用这样的脚本('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一次运行多个交易。